2017-08-25 81 views
0

首先,我知道我的問題的標題是含糊不清的,但我不知道該怎麼說。你會看到我的例子。如何將Lucene過濾器添加爲動態條件?

在SQL查詢中,可以將'1 = 1'應用於動態條件。

讓我舉個例子。

select * from PROD.EMPLY 
WHERE 1=1 
AND (NAME = 'JOHN' OR NAME = 'MARY' OR NAME = 'KEVIN') ; 

如上所述,我想應用下面的過濾器。

BooleanFilter BF = new BooleanFilter(); 
TermsFilter tf1 = new TermsFilter(); 
TermsFilter tf2 = new TermsFilter(); 

//tf1 => 1=1 

//tf2 => name condition 
tf2.addTerm("name", "JOHN"); 
tf2.addTerm("name", "MARY"); 
tf2.addTerm("name", "KEVIN"); 

BF.add(new FilterClause(tf1, Occur.MUST)); // 1=1 condition 
BF.add(new FilterClause(tf2, Occur.MUST)); // name condition 

但正如我希望的結果是不匹配的。(沒有命中)

據我所知,這是因爲有一個在Lucene中沒有空/空搜索方法。 我還檢查了是否可以用MatchAllDocsQuery來切換BooleanFilter/TermsFilter。

但是在我的情況下,我的Lucene版本很舊(2.3.2),我的版本中沒有MatchAllDocsQuery,我不希望過濾器的條件影響lucene的評分。

我在stackoverflow和谷歌搜索,但沒有匹配我的情況。

任何幫助將非常感激,並感謝您的閱讀。

+0

這確實很舊,不得不下載源代碼來檢查,但是* *是*,實際上是2.3.2中的一個'MatchAllDocsQuery'。 – femtoRgon

+0

@femtoRgon感謝您的評論。感謝您的評論,我發現有MatchAllDocsQuery。但是,如果可能的話,我想使用過濾器而不是使用MatchAllDocsQuery,因爲Query會影響Lucene的評分,而過濾器則不會。 – TwilighT

回答

0

我不想回答自己,但我希望我的不好解決方案可以幫助/激勵有同樣問題的人。

在我的情況,如上所述,我的Lucene版本是如此之低的版本,許多過濾器都受到限制。 但是,我不想使用查詢,因爲我不希望過濾器影響評分。

所以,我用「手動」過濾器清理了自己。 我的開發語言是Java,所以我使用了包含方法。

簡要說明我的解決方案,如下所示。

  1. 使用AS-IS方法搜索Lucene。
  2. 在結果,比較與包含方法

例如(I加入這個步驟。):

if (result.contains("KEVIN")) { 
isFilteredResult = true; 
} else if (result.contains("JOHN")) { 
isFilteredResult = true; 
} 
... 
  • 包含條件的關鍵字的唯一結果顯示。
  • 我很擔心這個解決方案,因爲這種方法是用Lucene而不是Java來完成的。所以,我猜想如此多的記憶會被消耗掉。 但是,性能並不差,因爲我很擔心,用戶對性能和結果都滿意。

    我知道這個解決方案不是很好的方法,但如果條件如此受限制,這種方式也是一個解決方案。

    感謝您的閱讀。 如果有更好的解決方案,請讓我知道。