在术语提取期间跳过MUST_NOT子句的术语

时间:2012-11-29 19:42:00

标签: lucene

我正在使用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);
      }
  }

现有实施的设计理由是什么?什么时候有意义?解决这个问题的最好方法是什么,假设我不想要否定术语,但不知道它们出现在查询树中的哪个位置?

1 个答案:

答案 0 :(得分:1)

Gene:也许你可以为此开一张LUCENE Jira票?

我实际上认为extractTerms应该按照你的建议去做。例如,如果我制作一个使用这种方法的简单荧光笔(我以前做过),我也不想要负面部分。我猜通常这是该方法大多数用途的预期行为。

至少它目前不一致,例如SpanNotQuery在同一条船上,并从extractTerms中排除了它的“负面”部分。