2010-08-30 46 views
7

我需要不在我的lucene索引上查詢。 Lucene的目前允許不僅當我們在查詢兩個或多個方面:不在lucene中查詢

所以我可以這樣做:

country:canada not sweden 

,但我不能運行一個查詢,如:

country:not sweden 

請您告訴我是否有針對此問題的一些有效解決方案

謝謝

回答

1

簡短的回答是,這是不可能使用標準的Lucene。

Lucene不允許將NOT查詢作爲一個單詞出於同樣的原因,它不允許前綴查詢 - 要執行,引擎將不得不查看每個文檔以確定文檔是否不是命中。它必須瀏覽每個文檔,因爲它不能使用搜索項作爲在倒排索引(用於存儲索引文檔)中查找文檔的關鍵。

要接你的案子爲例:

要搜索not sweden,最簡單的(也可能是最有效的)方法是尋找sweden,然後「反轉」的結果集返回的所有文件不在該結果集中。這樣做需要找到索引中所有必需的(即不在結果集中)文檔,但是沒有一個鍵可以查找它們。這可以通過遍歷索引中的文檔來完成 - 它不是優化的任務,因此速度會受到影響。

如果你真的需要這個功能,你可以建立索引時,維護自己的項目列表,從而使not sweden搜索成爲使用Lucene一個sweden搜索,然後用你的項目組結果的反轉。

16

非常晚的答覆,但它可能是有用的人後來其他:如果我沒有記錯的話這應該做

*:* AND NOT country:sweden 

邏輯「與」所有文件和文件與一個國家不同於「瑞典」。

1

好的,我明白你在做什麼。

由於Lucene中沒有一元布爾運算符,因此可以將它用作查詢優化。儘管有上述問題的答案,我相信這是一個更好的和最前沿的做法(注意通配符前的空格):

&query= *&qf=-country:Canada