2012-11-29 47 views
0

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

現有實現的設計原理是什麼?它何時有意義?假設我不想否定術語,但不知道它們出現在查詢樹中的什麼位置,解決此問題的最佳方法是什麼?

+0

「這樣的代碼可能更有意義」 - 爲什麼不從外部使用該代碼?這些方法應該都是公開的,所以你不需要觸摸現有的Lucene代碼,或者我錯過了什麼? –

+0

這裏假設一個布爾查詢; 'extractTerms'方法是遞歸調用的,因此我不能保證'BooleanQuery'不會嵌入到其他我沒有看到的東西中。 –

回答

1

基因:也許你可以爲此打開一個LUCENE Jira門票?

我實際上認爲extractTerms應該按照你的建議去做。例如,如果我製作一個簡單的使用這種方法的熒光筆(我之前已經完成),我也不需要陰性部分。我猜一般這是這種方法的大多數用途的預期行爲。

至少目前它是不一致的,例如, SpanNotQuery是在同一條船上,並從extractTerms中排除它的「負面」部分。

+0

謝謝,我會這樣做的。 –