我相信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