BooleanQueryのluceneでのBooleanClause.Occur.MustとBooleanClause.Occur.SHOULDの違いを例を挙げて説明できる人はいますか?
BooleanClause.Occur.SHOULD
は句がオプションであることを意味しますが、BooleanClause.Occur.Must
は、条項が必須であることを意味します。
ただし、ブールクエリにオプションの句しかない場合、ドキュメントを結果に表示するには、少なくとも1つの句が一致する必要があります。
BooleanQueryに一致するドキュメントをより適切に制御するために、 minimumShouldMatch パラメーターもあります。これにより、Luceneに少なくともminimumShouldMatch
BooleanClause.Occur.SHOULD
句は、ドキュメントが結果に表示されるために一致する必要があります。
例を使って説明しようと思います。
句Aと句Bの2つの句があると仮定します。これで、BooleanClause.Occurの効果は次のようになります。
最初のケースでは、句AとBの両方にBooleanClause.Occur.Shouldフラグが設定されています。これは、条項の1つ(AまたはB)が満たされている場合でも、ドキュメントがヒットすることを意味します。
2番目のケースでは、句AにBooleanClause.Occur.Mustフラグが設定され、句BにBooleanClause.Occur.Shouldフラグが設定されています。
この場合、ドキュメントは、条項Aを「満たす」ときにヒットします。このドキュメントが条項Bを満たしているかどうかは、ヒットになることには影響しません。
ただし、ドキュメントが条項Aを満たしていない場合は、条項Bを満たしているかどうかに関係なく、ヒットにはなりません。
3番目のケースでは、句Aと句Bの両方にBooleanClause.Occur.Mustフラグが設定されています。
この場合、ドキュメントは「両方」の句を満たす場合にのみヒットします。条項の1つでも満たすことができない場合、それはヒットにはなりません。
BooleanClause.Occur.Must
は必須句を表します。結果を返すには、条項を満たす必要があります。基本的にAND
。
BooleanClause.Occur.SHOULD
はオプションの句を表し、OR
のように動作します
SHOULD句は、最も重要な懸念事項がRANKINGである場合、luceneで最も重要な機能です。
SHOULD句を使用すると、Luceneは取得したドキュメントをSHOULD句のポイントの合計によってランク付けします。したがって、(重要度に応じて)さまざまなブーストを使用してSHOULD句とクエリを結合できます。これは、SolrのExtendedDismaxQueryの背後にある概念です。