Je suis en train de rassembler une preuve de concept pour la recherche Fulltext dans notre application en utilisant Lucene.NET. Certaines requêtes fonctionnent correctement, d'autres semblent renvoyer des résultats qui ne correspondent pas à ceux renvoyés par l'outil Luke. Plus problématiquement, cette requête:Exception d'exécution Lucene.NET cohérente sur certaines requêtes
(Description:tasty) (Gtin:00018389732061)
donne toujours cette exception:
Une exception non gérée du type 'System.IndexOutOfRangeException' a eu lieu en Lucene.Net.dll à Lucene.Net.Search.TermScorer .Score() dans d: \ Lucene.Net \ FullRepo \ tronc \ src \ core \ Search \ TermScorer.cs: ligne 136 à Lucene.Net.Search.BooleanScorer.BooleanScorerCollector.Collect (Int32 doc) dans d: \ Lucene.Net \ FullRepo \ tronc \ src \ core \ Search \ BooleanScorer.cs: lin e 88 à Lucene.Net.Search.TermScorer.Score (Collecteur c, Int32 fin, Int32 firstDocID) dans d: \ Lucene.Net \ FullRepo \ trunk \ src \ core \ Search \ TermScorer.cs: ligne 80
à Lucene.Net.Search.BooleanScorer.Score (Collecteur collecteur, Int32 max, Int32 firstDocID) dans d: \ Lucene.Net \ FullRepo \ trunk \ src \ core \ Search \ BooleanScorer.cs: ligne 323 à Lucene .Net.Search.BooleanScorer.Score (collecteur collecteur) dans d: \ Lucene.Net \ FullRepo \ trunk \ src \ core \ Search \ BooleanScorer.cs: ligne 389 à Lucene.Net.Search.IndexSearcher.Search (poids poids, filtre , collecteur collecteur) dans d: \ Lucene.Net \ FullRepo \ trunk \ src \ core \ Search \ IndexSearcher.cs: ligne 228 à Lucene.Net.Search.IndexSearcher.Search (poids, filtre filtre, Int32 nDocs) dans d: \ Lucene.Net \ FullRepo \ trunk \ src \ core \ Search \ IndexSearcher.cs: ligne 188 à Lucene.Net.Search.Searcher.Search (Requête de requête, Filtre de filtre, Int32 n) dans d: \ Lucene.Net \ FullRepo \ tronc \ src \ core \ Search \ Searcher.cs: ligne 108 à Lucene.Net. Search.Searcher.Search (requête de requête, Int32 n) dans d: \ Lucene.Net \ FullRepo \ tronc \ src \ core \ Search \ Searcher.cs: ligne 118
à ...
Si J'utilise cette requête à la place:
(Description:tasty) (Gtin:000)
Je reçois des résultats. Quelle est la cause de l'exception dans la requête du haut? FWIW, voici l'extrait de code correspondant:
protected virtual IList<Document> GetDocuments(BooleanQuery query, DirectoryInfo indexLocation, string defaultField)
{
var docs = new List<Document>();
using (var dir = new MMapDirectory(indexLocation))
{
using (var searcher = new IndexSearcher(dir))
{
var queryParser = new QueryParser(Constants.LuceneVersion, defaultField, new StandardAnalyzer(Constants.LuceneVersion));
TopDocs result = searcher.Search(query, Constants.MaxHits);
if (result == null) return docs;
foreach (var scoredoc in result.ScoreDocs.OrderByDescending(d => d.Score))
{
docs.Add(searcher.Doc(scoredoc.Doc));
}
return docs;
}
}
}
Sur la base des commentaires ci-dessous, voici mon code actuel non modifié qui ne fonctionne toujours pas.
protected virtual IList<Document> GetDocuments(BooleanQuery query, DirectoryInfo indexLocation, string defaultField)
{
var docs = new List<Document>();
using (var dir = new MMapDirectory(indexLocation))
{
using (var searcher = new IndexSearcher(dir))
{
using (var analyzer = new StandardAnalyzer(Constants.LuceneVersion))
{
var queryParser = new QueryParser(Constants.LuceneVersion, defaultField, analyzer);
var collector = TopScoreDocCollector.Create(Constants.MaxHits, true);
var parsed = queryParser.Parse(query.ToString());
searcher.Search(parsed, collector);
var docsresult = new List<string>();
var matches = collector.TopDocs().ScoreDocs;
foreach (var scoredoc in matches.OrderByDescending(d => d.Score))
{
docs.Add(searcher.Doc(scoredoc.Doc));
}
return docs;
}
}
}
}
En outre, cette requête: + (Description: savoureux) + Gtin: 000 * ne renvoie aucun résultat sur mon impl implant Lucene.NET, alors que Luke (correctement) renvoie 11 documents correspondants. – HelluvaEngineer
Est-ce que "Gtin" est indexé comme une chaîne ou un champ numérique? – AndyPook
Luke renverra souvent des résultats "différents" car l'analyseur est souvent différent de la façon dont les champs ont été indexés – AndyPook