2009-12-04 6 views
5

Je suis très nouveau sur lucene.net. J'ai écrit cette application de console simple en C# qui indexe certaines données fausses. J'ai alors voulu pouvoir rechercher l'index pour divers termes using un booleanquery.Lucene.Net qu'est-ce que je fais mal?

Je n'ai jamais aucun résultat. Voici le code. Toute aide serait grandement appréciée. Merci.

static void Main(string[] args) 
    { 
     StandardAnalyzer analyzer = new StandardAnalyzer(); 
     IndexWriter writer = new IndexWriter("Test", analyzer, true); 
     Console.WriteLine("Creating index"); 
     for (int i = 0; i < 1500; i++) 
     { 
      Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 
      doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO)); 
      doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO)); 
      doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO)); 
      doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO)); 
      writer.AddDocument(doc); 
     }    
     writer.Optimize(); 
     writer.Close(); 

     BooleanQuery query = new BooleanQuery(); 
     query.Add(new WildcardQuery(new Term("B", "lala*")), Lucene.Net.Search.BooleanClause.Occur.MUST); 
     query.Add(new WildcardQuery(new Term("C", "DoDo1*")), Lucene.Net.Search.BooleanClause.Occur.MUST); 

     IndexSearcher searcher = new IndexSearcher("Test"); 
     Hits hits = searcher.Search(query); 
     if (hits.Length() > 0) 
     { 
      for (int i = 0; i < hits.Length(); i++) 
      { 
       Console.WriteLine("{0} - {1} - {2} - {3}", 
        hits.Doc(i).GetField("A").StringValue(), 
        hits.Doc(i).GetField("B").StringValue(), 
        hits.Doc(i).GetField("C").StringValue(), 
        hits.Doc(i).GetField("D").StringValue()); 
      } 
     } 
     searcher.Close(); 

     Console.WriteLine("Done"); 

     Console.ReadLine(); 
    } 

Je puis ai eu à travailler en utilisant MultiFieldQueryParser comme ceci:

static void Main(string[] args) 
    { 
     StandardAnalyzer analyzer = new StandardAnalyzer();    

     IndexWriter writer = new IndexWriter("Test", analyzer, true); 
     Console.WriteLine("Creating index"); 
     for (int i = 0; i < 1500; i++) 
     { 
      Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 
      doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED)); 
      doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED)); 
      doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED)); 
      doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED)); 
      writer.AddDocument(doc); 
     }    
     writer.Optimize(); 
     writer.Close();    

     BooleanQuery.SetMaxClauseCount(5000); 
     Query query = MultiFieldQueryParser.Parse(new string[] { "LALA*", "DODO*" }, new string[] { "B", "C" }, analyzer); 

     IndexSearcher searcher = new IndexSearcher("Test"); 
     Hits hits = searcher.Search(query); 
     if (hits.Length() > 0) 
     { 
      for (int i = 0; i < hits.Length(); i++) 
      { 
       Console.WriteLine("{0} - {1} - {2} - {3}", 
        hits.Doc(i).GetField("A").StringValue(), 
        hits.Doc(i).GetField("B").StringValue(), 
        hits.Doc(i).GetField("C").StringValue(), 
        hits.Doc(i).GetField("D").StringValue()); 
      } 
     } 
     searcher.Close(); 

     Console.WriteLine("Done"); 

     Console.ReadLine(); 
    } 

Ceci est probablement le meilleur article que j'ai trouvé pour les nouveaux développeurs Lucene: http://www.ifdefined.com/blog/post/2009/02/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx

Répondre

5

Je pense qu'il est un problème lors de la construction de votre index. Vous ajoutez quatre champs à chaque document, tous sont stockés mais aucun n'est indexé (=> Lucene.Net.Documents.Field.Index.NO). Vous devriez indexer au moins sur le terrain.

Prenez garde à ce que StandardAnalyzer classe chaque index de champ de la façon suivante: en minuscules et en séparant avec des mots d'arrêt anglais communs. Donc, lors de la construction de votre requête, utilisez le préfixe LOWERCASE afin d'avoir des hits:

query.Add(new PrefixQuery(new Term("B", "lala")), BooleanClause.Occur.MUST); 
query.Add(new PrefixQuery(new Term("C", "dodo")), BooleanClause.Occur.MUST); 
+0

Je tokenized le champ A et re-couru l'application. Il n'a toujours pas retourné de résultats. – dnoxs

+0

D'autres suggestions? Merci pour votre réponse rapide. – dnoxs

+0

Vous pouvez uniquement effectuer une recherche sur des champs indexés. Vous devez donc également indexer les champs "B" et "C". –

Questions connexes