2012-03-16 8 views
0

Lucenceに短い非解析フィールドが格納されていると仮定すると、このフィールドに特定のサブストリングが含まれているドキュメントを検索する方法があります。例えば、このフィールドの値は "AA-883 67分の98は、" フォローストリング "883"、 "67分の98"、 "AA-883" と一致させることができるSimpleにLuceneのクエリが含まれています

、 "883 98" 等

私はLuceneを照会するときにこれを他のフィルターと組み合わせる必要があります。これはLucene.NET向けです2.9

答えて

1

ワイルドカード用語がワイルドカード(*または?)で始まる場合は、そのフィールドに明確な用語がたくさんある場合は非常に遅くなります。

ここでは、WildcardQueryの記述方法を簡単に説明します。これは廃止予定のものを使用しており、廃止されていない過負荷を使用するように変更する必要があります。

他のクエリと組み合わせるには、BooleanQueryクラスを使用します。これにより、複数のクエリを組み合わせることができます。

RAMDirectory dir = new RAMDirectory(); 
IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer()); 

Document doc = new Document(); 
doc.Add(new Field("test", "AA-883 98/67", Field.Store.YES, Field.Index.NOT_ANALYZED)); 
iw.AddDocument(doc); 
iw.Commit(); 

IndexSearcher searcher = new IndexSearcher(iw.GetReader()); 

WildcardQuery query = new WildcardQuery(new Term("test", "*883*")); 
Hits hits = searcher.Search(query); 
Console.WriteLine(hits.Length()); 
// prints 1 

query = new WildcardQuery(new Term("test", "*98/67*")); 
hits = searcher.Search(query); 
Console.WriteLine(hits.Length()); 
// prints 1 

query = new WildcardQuery(new Term("test", "*AA-883*")); 
hits = searcher.Search(query); 
Console.WriteLine(hits.Length()); 
// prints 1 

query = new WildcardQuery(new Term("test", "*883 98*")); 
hits = searcher.Search(query); 
Console.WriteLine(hits.Length()); 
// prints 1 

Console.ReadLine(); 
iw.Close(); 
dir.Close(); 
+0

おそらく、私の例を更新する必要があります...完了...フィールドが分​​析されていない場合は、この作業は可能ですか? – AnthonyWJones

+0

フィールドが解析されていないとうまくいく、ちょっとしたサンプルで答えを更新する –

+0

この答えは正しいですが、この種のクエリ(先行するワイルドカード付き)はすべての条件を調べる必要があることを知る必要がありますその結果、大きな索引ではパフォーマンスが非常に悪くなる可能性があります。 – jpountz

関連する問題