ワイルドカード用語がワイルドカード(*または?)で始まる場合は、そのフィールドに明確な用語がたくさんある場合は非常に遅くなります。
ここでは、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();
おそらく、私の例を更新する必要があります...完了...フィールドが分析されていない場合は、この作業は可能ですか? – AnthonyWJones
フィールドが解析されていないとうまくいく、ちょっとしたサンプルで答えを更新する –
この答えは正しいですが、この種のクエリ(先行するワイルドカード付き)はすべての条件を調べる必要があることを知る必要がありますその結果、大きな索引ではパフォーマンスが非常に悪くなる可能性があります。 – jpountz