我目前在爲Lucene/Solr指定過濾器時遇到問題。我提出的每個解決方案都打破了其他解決方案讓我從一個例子開始。假設我們有以下5個文件:使用複雜過濾器的Lucene Solr
- DOC1 = [類型:汽車,銷往:假的,老闆約翰]
- DOC2 = [類型:自行車,產品編號:1,老闆布萊恩]
- doc3的= [類型:汽車,銷售:真,所有者:麥克]
- DOC4 = [類型:自行車,產品編號:2,所有者:約什]
- doc5 = [類型:汽車,銷售:假的,所有者:約翰]
所以我需要構造下面的過濾器R查詢器:
給我類型的所有文件:已售出汽車:假的只是,如果它是一類不同的是這輛車,包括在結果中。所以基本上我想要文檔1,2,4,5我不想要的唯一文檔是doc3,因爲它已經售出:true。爲了更準確地說:
for each document d in solr/lucene if d.type == Car { if d.sold == false, then add to result else ignore } else { add to result } return result
過濾程序,因爲是所有文檔(類型:Car和出售:假)或(類型:自行車和產品編號:1)。所以爲此我會得到1,2,5。
- 獲取所有文件,如果類型:汽車然後只與賣出:假,否則讓我從業主約翰,布賴恩,喬希文件。因此,對於這個查詢我應該得到1,2,4,5
注:你不知道文檔中的所有類型。這裏顯而易見的是由於文件數量很少。
所以我的解決方案是:
- (型:汽車)OR((類型:汽車)AND(出售:假)這工作得很好,並預期
- ((型:汽車)或((類型:汽車)和(銷售:虛假))和((類型:自行車)或((類型:自行車)和(產品ID:1)))此解決方案不起作用
- (所有者:約翰)或(所有者:布賴恩)或(所有者:喬希))和((類型:汽車)或((類型:汽車)和(銷售:假))這不起作用,我可以做到((所有者:約翰)或(所有者:布賴恩)或(所有者:喬希))和((版本:* OR(--type:Car ))或((類型:汽車)和(銷售:假))。我不明白這是如何工作的,因爲邏輯上它應該工作,但Solr/Lucene以某種方式做某事。
你能給的那種解決方案的一個例子,你沒試過嗎?我想象一下,如果用查詢過濾器包裝器包裝每個子查詢作爲TermQuery與Occur.MUST的簡單布爾查詢(如果聽起來像mumbo-jumbo,讓我知道,我會把它變成一個完整的答案) 。 – joshlf
@ joshlf13,請盡興。 –
@ joshlf13我把我的解決方案,如果它仍然適用,請把你的解決方案。 – Ammar