有没有办法在lucene中使用RegexpQuery按顺序搜索术语?

时间:2013-04-05 02:43:17

标签: regex lucene

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

例如我有2个文件 文:甲骨文推出的季度业绩好于预期。 文本:Research In Motion股票周五在多伦多证券交易所上涨近13%,此前一天智能手机制造商发布了好于预期的季度业绩。

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

查询regexq = new RegexpQuery(新术语(“text”,“^。+ better。+ quarterly。+ results”));

还有另一种实现方法吗?

由于

1 个答案:

答案 0 :(得分: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

我认为它旨在将术语与正则表达式进行比较,并且因为您正在搜索的短语(我假设)被标记化,所以没有任何单个术语与您的整个正则表达式匹配。您需要使用StringFieldKeywordAnalyzer或类似内容将整个字段编入索引作为单个术语。

我认为它的作用类似于Matcher.matches(),而不是Matcher.find(),也就是说,它必须匹配整个输入术语,而不是它的一部分。因此,如果您已将“text”指定为StringField,则需要在末尾添加.*以使用其余输入。

在类似的说明中,我不确定它是否支持使用字符“^”作为输入的开始,因为在这种情况下它是多余的。我没有在Lucene's Regexp中看到它,但我已经看到了它的使用,所以我不确定它是否会被接受。

总而言之,RegexpQuery可以像:

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

如果您使用StringFieldKeywordAnalyzer索引整个字段作为单个字词。

在正则表达式中使用前导通配符时,您可能会发现它的性能非常差(请参阅RegexpQuery documentation顶部的警告)。