2011-05-31 13 views
5

Je rencontre un problème lors de l'utilisation de SnowBallAnalyzer dans Lucene.NET. Cela fonctionne très bien pour certains mots, mais d'autres ne trouvent aucun résultat, et je ne sais pas trop comment approfondir ce sujet pour savoir ce qui se passe. Je suis en train de tester la recherche sur le fichier USDA Food Description qui peut être trouvé ici (http://www.ars.usda.gov/SP2UserFiles/Place/12354500/Data/SR23/asc/FOOD_DES.txt). J'utilise l'algorithme anglais stemming. Je reçois les résultats suivants lors de la recherche de "oeufs":Problème lié à Lucene.NET

Bagels, egg 
Bread, egg 
Egg, whole, raw, fresh 
Egg, white, raw, fresh 
Egg, yolk, raw, fresh 
Egg, yolk, raw, frozen 
Egg, whole, cooked, fried 
... 

Ces résultats sont excellents. Cependant, je n'obtiens aucun résultat lors de la recherche de "pomme". Quand j'utilise le StandardAnalyzer, et que je recherche "apple", j'obtiens les résultats suivants.

Croissants, apple 
Strudel, apple, 
Babyfood, juice, apple 
Babyfood, apple-banana juice 
... 

Pas les meilleurs résultats, mais au moins ça montre quelque chose. Quelqu'un sait-il pourquoi l'analyseur de bourrage filtrerait de telle manière que je n'obtiendrais aucun résultat? Edit: Voici mon code prototype que je travaille avec.

static string[] Search(string searchTerm) 
{ 
    //Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Snowball.SnowballAnalyzer("English"); 
    Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(); 
    Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer); 
    Lucene.Net.Search.Query query = parser.Parse(searchTerm); 

    Lucene.Net.Search.Searcher searcher = new Lucene.Net.Search.IndexSearcher(Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo("./index/")), true); 
    var topDocs = searcher.Search(query, null, 10); 

    List<string> results = new List<string>(); 

    foreach(var scoreDoc in topDocs.scoreDocs) 
    { 
     results.Add(searcher.Doc(scoreDoc.doc).Get("raw")); 
    } 

    return results.ToArray(); 
} 

Répondre

5

Etes-vous sûr d'avoir utilisé Lucene.Net.Analysis.Snowball.SnowballAnalyzer("English") pour écrire votre index? Vous devez utiliser le même analyseur pour écrire et interroger l'index.

+0

Ceci est probablement le cas. Je vais confirmer et ensuite accepter. Merci! –