0

我正在使用 Lucene 3.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 回答