0

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

既存の実装の設計上の根拠は何ですか?いつ意味がありますか?否定された用語は必要ないが、クエリツリーのどこでそれらが発生するかわからないと仮定して、この問題を回避するための最良の方法は何ですか?

4

1 に答える 1

1

Gene: これについて LUCENE Jira チケットをオープンしていただけないでしょうか?

私は実際にあなたが提案するようにextractTermsがすべきだと思います。たとえば、この方法を使用する単純な蛍光ペンを作成する場合 (以前に行ったことがあります)、負の部分も必要ありません。一般的に、これはこのメソッドのほとんどの使用で予想される動作であると推測しています。

少なくとも現在は一貫性がありません。たとえば、SpanNotQuery は同じ船に乗っており、extractTerms から「負の」部分を除外しています。

于 2012-12-06T04:51:53.980 に答える