Lucene3.6.1を使用しています。BooleanQuery
としてマークされている句がいくつかありますOccur.MUST_NOT
。このクエリから用語を抽出すると、発生してはならない用語もうまく抽出されます。これは、次のコードが原因です。BooleanQuery.java
@Override
public void extractTerms(Set<Term> terms) {
for (BooleanClause clause : clauses) {
clause.getQuery().extractTerms(terms);
}
}
これらの用語を使用して、クエリに追加またはクエリから削除できる一連の用語をユーザーに提示しています。ユーザーが特定の用語またはフレーズが望ましくないことを明示的に指定した場合(たとえば、-"foo bar"
クエリに追加することによって)、これらの用語をユーザーに表示したくありません。もっと理にかなっているのは、次のようなコードです。
@Override
public void extractTerms(Set<Term> terms) {
for (BooleanClause clause : clauses) {
if (!clause.isProhibited())
clause.getQuery().extractTerms(terms);
}
}
既存の実装の設計上の根拠は何ですか?いつ意味がありますか?否定された用語は必要ないが、クエリツリーのどこでそれらが発生するかわからないと仮定して、この問題を回避するための最良の方法は何ですか?