サーチ…


ブールクエリ

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow