2013-04-05 115 views
0

我想使用RegexpQuery按順序搜索我的索引文檔。有沒有辦法在Lucene中使用RegexpQuery搜索術語?

例如我有2文檔 文本:甲骨文公佈的季度業績好於預期。 原文:Research In Motion股價週五在多倫多證券交易所上漲近13%,該智能手機制造商公佈的季度業績好於預期。

到目前爲止,我試過這個,但我沒有運氣。

查詢regexq = new RegexpQuery(new term(「text」,「^。+ better。+ quarterly。+ results」));

有沒有另外一種方法來實現呢?

感謝

回答

0

我相信PhraseQuery適合你在找什麼更好的。您可以使用PhraseQuery.setSlop(int)來允許條款在查詢條款之間出現。本想這樣的:

Query pq = new PhraseQuery(); 
pq.add(new Term("text", "better")); 
pq.add(new Term("text", "quarterly")); 
pq.add(new Term("text", "results")); 
pq.setSlop(10); //Or whatever is an appropriate slop value for you. 

這類查詢也由標準的QueryParser,as seen here支持,如:

text:"better quarterly results"~10 


我覺得PhraseQuery是最肯定更好地執行在這裏,但...

關於RegexpQuery

我相信這是INT結束與正則表達式進行比較,並且由於您正在搜索的短語(我假設)被標記化,因此沒有單個詞語與您的整個正則表達式匹配。您需要使用StringField,KeywordAnalyzer或類似的索引將整個字段索引爲單個字段以完成此項工作。

我認爲它的工作原理與Matcher.matches()相似,而不是Matcher.find(),也就是說,它必須匹配整個輸入項,而不是它的一部分。因此,如果您將「文本」指定爲StringField,則需要在末尾添加.*以消耗其餘的輸入。

在類似的說明中,我不確定它是否支持使用字符「^」作爲輸入的開始,因爲它在這種情況下是冗餘的。我沒有看到它在Lucene's Regexp中指定,但我已經看到它的使用參考,所以我不知道它是否會被接受。

總之,一個RegexpQuery可以工作,如:

Query regexq = new RegexpQuery(new Term("text", ".+better.+quarterly.+results.*")); 

如果您使用的StringField,或KeywordAnalyzer指數整場作爲一個單一期限。

雖然在您的正則表達式中使用了前導通配符,但您可能會發現其性能很差(請參閱RegexpQuery documentation頂部的警告)。

+0

感謝您的解釋。 – 2013-04-08 01:51:01

+0

但是我之前使用過PhraseQuery,但搜索結果條款並未保留在順序中。我最終將SpanTermQuery和SpanNearQuery添加到了BooleanQuery中。 – 2013-04-08 02:00:21

相關問題