我正在嘗試查找是否有方法在lucene中搜索以查找所有文檔中至少有一個單詞與特定單詞不匹配。Lucene:查詢至少
E.g.我想查找除「測試」之外至少有一個單詞的所有文檔。即「測試」可能存在也可能不存在,但應該至少有一個「測試」以外的詞。有沒有辦法在Lucene中做到這一點?
感謝, Purushotham
我正在嘗試查找是否有方法在lucene中搜索以查找所有文檔中至少有一個單詞與特定單詞不匹配。Lucene:查詢至少
E.g.我想查找除「測試」之外至少有一個單詞的所有文檔。即「測試」可能存在也可能不存在,但應該至少有一個「測試」以外的詞。有沒有辦法在Lucene中做到這一點?
感謝, Purushotham
Lucene的能做到這一點,但是這不會是一個好主意。
查詢執行的性能必然會兩個因素:
性能查詢是可以快速與術語詞典相交併且僅匹配幾個術語以便第二步不會花費太長時間的那些查詢。例如,爲了禁止太複雜的布爾查詢,Lucene默認將子句數限制爲1024。
使用TermQuery時,需要(默認情況下)O(log(n))
操作(其中n是詞典詞典的大小)在內存中相交,然後在磁盤上進行一次隨機訪問,最多16個詞條的流。另一個例子是blog entry from Lucene committer Mike McCandless,它描述了當第一步的蠻力實現被更聰明的東西所取代時,FuzzyQuery的性能如何提高。
但是,您所描述的查詢將需要檢查術語詞典的每一個術語,並關閉僅在「測試」文檔集中的文檔!
您應該提供有關您的用例的更多詳細信息,以便人們可以考慮更有效地解決您的問題。
如果您需要一個帶有單個否定條件的查詢,那麼使用帶MatchAllDocsQuery的BooleanQuery和帶有= MUST_NOT的TermQuery。沒有辦法強制執行存在性約束(「必須包含至少一個不被排除的術語」)。一旦您檢索到Lucene的結果,您必須單獨檢查。根據有利結果與Lucene返回的所有結果的比率,這種解決方案可以從完美的罰款到性能災難。