我想使用RegexpQuery按顺序搜索我的索引文档。
例如我有2个文件 文:甲骨文推出的季度业绩好于预期。 文本:Research In Motion股票周五在多伦多证券交易所上涨近13%,此前一天智能手机制造商发布了好于预期的季度业绩。
到目前为止,我试过这个,但我没有运气。
查询regexq = new RegexpQuery(新术语(“text”,“^。+ better。+ quarterly。+ results”));
还有另一种实现方法吗?
由于
答案 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:
我认为它旨在将术语与正则表达式进行比较,并且因为您正在搜索的短语(我假设)被标记化,所以没有任何单个术语与您的整个正则表达式匹配。您需要使用StringField
,KeywordAnalyzer
或类似内容将整个字段编入索引作为单个术语。
我认为它的作用类似于Matcher.matches()
,而不是Matcher.find()
,也就是说,它必须匹配整个输入术语,而不是它的一部分。因此,如果您已将“text”指定为StringField,则需要在末尾添加.*
以使用其余输入。
在类似的说明中,我不确定它是否支持使用字符“^
”作为输入的开始,因为在这种情况下它是多余的。我没有在Lucene's Regexp中看到它,但我已经看到了它的使用,所以我不确定它是否会被接受。
总而言之,RegexpQuery
可以像:
Query regexq = new RegexpQuery(new Term("text", ".+better.+quarterly.+results.*"));
如果您使用StringField
或KeywordAnalyzer
索引整个字段作为单个字词。
在正则表达式中使用前导通配符时,您可能会发现它的性能非常差(请参阅RegexpQuery documentation顶部的警告)。