我相信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頂部的警告)。
感謝您的解釋。 – 2013-04-08 01:51:01
但是我之前使用過PhraseQuery,但搜索結果條款並未保留在順序中。我最終將SpanTermQuery和SpanNearQuery添加到了BooleanQuery中。 – 2013-04-08 02:00:21