2011-11-04 77 views
2

我知道,Lucene documentation如何使用Lucene搜索不包含術語的文檔?

注意:NOT操作符不能只用一個學期使用。例如, 以下搜索將返回任何結果:

NOT「雅加達阿帕奇」

不過,我想能夠形成返回不包含項的所有文檔的查詢。我已經考慮將MatchAllDocsQueryTermQuery連在一起成爲BooleanQuery,但我似乎無法找到正確的組合。

如果我索引以下兩個文件

Doc0: content:The quick brown fox jumps over the lazy dog. 
Doc1: (empty string) 

查詢*:* -content:fox返回這兩個文件時,我只想一個文檔。

的RegexQuery content:^((?!fox).)*$建議由this StackOverflow answer返回一個文檔,但它似乎並沒有被因爲content:^((?!foo).)*$返回一個文檔正常工作,以及時,我希望它返回兩個文件。

我意識到我想要做的性能影響。查詢只會在幾個文檔上運行,所以我不太在意性能。

有沒有辦法寫一個Lucene查詢來得到我想要的?

回答

5

您可以使用匹配的一切,排除術語 -

IndexSearcher searcher = new IndexSearcher("path_to_index"); 
MatchAllDocsQuery everyDocClause = new MatchAllDocsQuery(); 
TermQuery termClause = new TermQuery(new Term("text", "exclude_term")); 
BooleanQuery query = new BooleanQuery(); 
query.add(everyDocClause, BooleanClause.Occur.MUST); 
query.add(termClause, BooleanClause.Occur.MUST_NOT); 
Hits hits = searcher.search(query); 

否則,有一個空場的一些固定值,並且使用查詢

+dummy_field:dummy_value -exclude_term 
+0

你的答案都爲我工作。 MatchAllDocsQuery是首選。起初,我實現了MatchAllDocsQuery,它沒有工作,所以我問了這個問題。當我得到虛擬領域的工作時,我切換回MatchAllDocsQuery進行完整性檢查,並且工作正常。我不知道爲什麼它以前不適合我。我必須得到一個錯誤的步驟。 – BennyMcBenBen

1

你不能爲每個文檔附加一個「人工」標記,然後搜索「'添加的標記'而不是'你想要避免的'」嗎?

相關問題