サーチ…
ブールクエリ
BooleanQueryは、他のクエリを結合するために使用されます。
3つのBooleanClause.Occurパラメータを使用して組み合わせることができます。
-
BooleanClause.Occur.MUST
- サブクエリは一致する必要があります。 -
BooleanClause.Occur.SHOULD
- サブクエリは一致していない可能性がありますが、サブクエリが一致している場合はさらに高く評価されます。 MUST句がない場合、少なくとも1つのSHOULD句が一致しなければなりません。 -
BooleanClause.Occur.MUST_NOT
- サブクエリはドキュメントと一致してはいけません。
この例では、ドキュメントは「重要」で「禁止」ではなく 、「有益」であれば高いスコアを取得します。
Query importantQuery = new TermQuery(new Term("fieldname", "important"));
Query optionalQuery = new TermQuery(new Term("fieldname", "helpful"));
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery query = new BooleanQuery.Builder()
.add(importantQuery, BooleanClause.Occur.MUST)
.add(optionalQuery, BooleanClause.Occur.SHOULD)
.add(forbidQuery, BooleanClause.Occur.MUST_NOT)
.build();
または、一致する必要がある句の最小数を指定することもできます。
Query query1 = new TermQuery(new Term("fieldname", "one"));
Query query2 = new TermQuery(new Term("fieldname", "two"));
Query query3 = new TermQuery(new Term("fieldname", "three"));
BooleanQuery query = new BooleanQuery.Builder()
.add(query1, BooleanClause.Occur.SHOULD)
.add(query2, BooleanClause.Occur.SHOULD)
.add(query3, BooleanClause.Occur.SHOULD)
.setMinimumNumberShouldMatch(2)
.build();
Gotcha: BooleanClause.Occur.MUST_NOT
は他のすべてとBooleanClause.Occur.MUST_NOT
しません。一致するもののみが削除されます。 BooleanQueryには、少なくとも1つのMUST
またはSHOULD
句が必要です。一致しない場合は、何も一致しません。これは、たとえば、動作しません :
//***This does NOT work!***
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery getEverythingElseQuery = new BooleanQuery.Builder()
.add(forbidQuery, BooleanClause.Occur.MUST_NOT)
.build();
フレーズクエリ
PhraseQueryは一連の用語を検索するために使用されます。以下は、 "Hello World"というフレーズに一致します( StandardAnalyzer
で索引付けされた後)
Query query = new PhraseQuery.Builder()
.add(new Term("text", "hello"))
.add(new Term("text", "world"))
.build();
PhraseQueryは、 setSlop
最大の編集距離を設定することで、クエリー内の "slop"や特別な用語を扱うこともできます。これは "Lorem ipsum sit amet dolor"と一致します:
Query query = new PhraseQuery.Builder()
.add(new Term("text", "lorem"))
.add(new Term("text", "amet"))
.setSlop(2)
.build();
正確な位置の増分を設定することもできます。
Query query = new PhraseQuery.Builder()
.add(new Term("text", "lorem"), 0)
.add(new Term("text", "sit"), 2)
.add(new Term("text", "dolor"), 4)
.build();
DisjunctionMaxQuery
これは、サブクエリの最良の(つまり、最高得点の)マッチが最終スコアに寄与するようなクエリを組み合わせます。
List<Query> disjuncts = new ArrayList<Query>();
disjuncts.add(new TermQuery(new Term("fieldname", "hello")));
disjuncts.add(new TermQuery(new Term("fieldname", "world")));
Query query = new DisjunctionMaxQuery(disjuncts, 0.0f);
DisjunctionMaxQuery
コンストラクタの2番目の引数はtiebreakerの値です。非ゼロの場合は、非最大マッチでスコアに多少の貢献をして、ネクタイを破ります。それは一般に小さくなければならない(0.1程度)。
クエリの昇格
他のサブクエリに比べてスコアを上げるために、クエリを追加することができます。これは、BoostQueryでラップすることによって行われます
Query lessRelevantQuery = new TermQuery(new Term("fieldname", "ipsum"));
//Five times as interesting
Query highlyRelevantQuery = new BoostQuery(
new TermQuery(new Term("fieldname", "lorem")),
5.0f);
BooleanQuery query = new BooleanQuery.Builder()
.add(lessRelevantQuery, BooleanClause.Occur.SHOULD)
.add(highlyRelevantQuery, BooleanClause.Occur.SHOULD)
.build();