我相信 aPhraseQuery
更适合您正在寻找的东西。您可以使用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 也支持这种查询,如下所示:
text:"better quarterly results"~10
我认为 PhraseQuery 绝对是这里更好的实现,但是......
关于RegexpQuery:
我相信它旨在将术语与正则表达式进行比较,并且由于您正在搜索的短语(我假设)是标记化的,因此没有单个术语与您的整个正则表达式匹配。您需要使用 、 或类似方法将整个字段索引为单个 Term 以使其正常StringField
工作KeywordAnalyzer
。
我相信它的工作方式类似于Matcher.matches()
,而不是Matcher.find()
,也就是说,它必须匹配整个输入项,而不是其中的一部分。因此,如果您已将 "text" 指定为StringField,则需要.*
在末尾添加 a 以使用其余输入。
同样,我不确定它是否支持使用字符“ ^
”作为输入的开头,因为在这种情况下它是多余的。我没有在Lucene 的 Regexp中看到它,但我看到了它的使用参考,所以我不确定它是否会被接受。
总而言之,aRegexpQuery
可以像这样工作:
Query regexq = new RegexpQuery(new Term("text", ".+better.+quarterly.+results.*"));
如果您使用StringField
, 或KeywordAnalyzer
将整个字段索引为单个 Term。
但是,使用正则表达式中的前导通配符,您可能会期望它的性能很差(请参阅RegexpQuery 文档顶部的警告)。