0

我想使用 RegexpQuery 按顺序搜索我的索引文档。

例如,我有 2 个文档文本:Oracle 公布的季度业绩好于预期。文本:在智能手机制造商公布的季度业绩好于预期的第二天,Research In Motion 的股票周五在多伦多证券交易所上涨了近 13%。

到目前为止,我尝试了这个,但我没有运气。

查询 regexq = new RegexpQuery(new Term("text", "^.+better.+quarterly.+results"));

还有另一种实现方式吗?

谢谢

4

1 回答 1

0

我相信 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 文档顶部的警告)。

于 2013-04-05T15:17:11.527 回答