2013-04-05 76 views
0

我想使用RegexpQuery按顺序搜索我的索引文档。有没有办法在Lucene中使用RegexpQuery搜索术语?

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

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

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

有没有另外一种方法来实现呢?

感谢

回答

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

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

+0

感谢您的解释。 – 2013-04-08 01:51:01

+0

但是我之前使用过PhraseQuery,但搜索结果条款并未保留在顺序中。我最终将SpanTermQuery和SpanNearQuery添加到了BooleanQuery中。 – 2013-04-08 02:00:21

相关问题