我正在使用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);
}
}
现有实施的设计理由是什么?什么时候有意义?解决这个问题的最好方法是什么,假设我不想要否定术语,但不知道它们出现在查询树中的哪个位置?
答案 0 :(得分:1)
Gene:也许你可以为此开一张LUCENE Jira票?
我实际上认为extractTerms应该按照你的建议去做。例如,如果我制作一个使用这种方法的简单荧光笔(我以前做过),我也不想要负面部分。我猜通常这是该方法大多数用途的预期行为。
至少它目前不一致,例如SpanNotQuery在同一条船上,并从extractTerms中排除了它的“负面”部分。