我正在使用Lucene 3.6.1。我有一個BooleanQuery
的一些條款標記爲Occur.MUST_NOT
。當我從這個查詢中提取條款時,它會愉快地提取不可能發生的條款。這是由於在BooleanQuery.java
在術語提取期間跳過MUST_NOT子句的條款
@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);
}
}
現有實現的設計原理是什麼?它何時有意義?假設我不想否定術語,但不知道它們出現在查詢樹中的什麼位置,解決此問題的最佳方法是什麼?
「這樣的代碼可能更有意義」 - 爲什麼不從外部使用該代碼?這些方法應該都是公開的,所以你不需要觸摸現有的Lucene代碼,或者我錯過了什麼? –
這裏假設一個布爾查詢; 'extractTerms'方法是遞歸調用的,因此我不能保證'BooleanQuery'不會嵌入到其他我沒有看到的東西中。 –