2009-12-04 6 views
5

私はlucene.netさんとの初めての話です。私はこの単純なコンソールアプリケーションをC#で書いて、いくつかの偽のデータを索引付けしています。私はその後、booleanクエリを使用して、さまざまな用語の索引を検索できるようにしたいと考えました。Lucene.Net何が間違っていますか?

私は決して戻って何の結果も得られません。ここにコードがあります。どんな助けでも大歓迎です。ありがとう。

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(); 
    } 

私は、それはそうMultiFieldQueryParser等を用いて動作するようになった:

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(); 
    } 

これはおそらく、私はすべての新しいluceneの開発者のために見つけた最高の記事です:http://www.ifdefined.com/blog/post/2009/02/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx

答えて

5

私はそこだと思いますあなたのインデックスを構築する際の問題です。 4つのフィールドを各ドキュメントに追加します。それらのフィールドはすべて保存されますが、インデックスは作成されません(=> Lucene.Net.Documents.Field.Index.NO)。フィールドに少なくともインデックスを付ける必要があります。

StandardAnalyzerは、各フィールドインデックスをトークン化する際に、以下の方法でトークン化することに注意してください。小文字化と一般的な英語のストップワードによる分割。クエリを作成するときは、ヒットするためにLOWERCASEプレフィックスを使用してください。

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

私はAフィールドをトークン化してアプリケーションを再実行しました。それでも結果は返ってこなかった。 – dnoxs

+0

他の提案はありますか?迅速な対応をありがとう。 – dnoxs

+0

インデックス付きフィールドに対してのみ検索を実行できます。したがって、 "B"と "C"フィールドのインデックスを作成する必要があります。 –

関連する問題