我正在使用 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);
}
}
现有实施的设计原理是什么?什么时候有意义?假设我不想要否定项,但不知道它们出现在查询树的哪个位置,那么解决这个问题的最佳方法是什么?