我需要搜索lucene索引中的任何术语,匹配特定的正则表达式。我知道我可以使用solr中的TermsComponent
来完成它,如果它被这样包含:
<searchComponent name="terms" class="solr.TermsComponent"/>
<!-- A request handler for demonstrating the terms component -->
<requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<bool name="terms">true</bool>
<bool name="distrib">false</bool>
</lst>
<arr name="components">
<str>terms</str>
</arr>
</requestHandler>
例如,我想获取包含“表面缺陷”的任何术语。使用solr我可以这样做:
http://localhost:8983/solr/core1/terms?terms.fl=content&
terms.regex=^(.*?(\bsurface%20defects\b)[^$]*)$&
terms.sort=count&
terms.limit=10000
但我的问题是,如何通过使用Lucene API而不是solr来实现相同的目标?我查看了org.apache.solr.handler.component.TermsComponent
课程,但对我来说不是很明显。
答案 0 :(得分:2)
您可以使用RegexQuery:
Query query = new RegexQuery(new Term("myField", myRegex));
String queryString = "/" + myRegex + "/";
QueryParser parser = new QueryParser("myField", new KeywordAnalyzer());
Query query = parser.parse(queryString);
现在,我的问题是:你确定正则表达式在Solr中有效吗?
我还没有尝试TermsComponent
正则表达式功能,所以也许它在这里做了一些花哨的SpanQuery步法,或者在检索到的存储字段上运行正则表达式,或类似的东西,但你是使用Lucene支持不的正则表达式语法,并且可能会对Lucene中正则表达式如何工作做出一些不准确的假设。
最重要的一点:lucene正则表达式查询必须与整个术语匹配。如果您的领域未被分析,那么这里的一般想法应该有效。如果使用StandardAnalyzer
进行分析,则无法使用正则表达式查询进行此类搜索,因为&#34;表面缺陷&#34;将被分成多个术语。从好的方面来说,在这种情况下,一个简单的PhraseQuery可能会工作得很好,而且更快更容易(一般来说,Lucene正则表达式查询:你可能不需要它们,如果你这样做,你就是可能应该更好地分析了。)
^
和$
无法正常工作。您正在尝试匹配术语,并且必须匹配整个术语才能匹配。因此,这些不适用于任何目的,也不受支持。
.*?
并非错误,但不支持不情愿的匹配,因此它是多余的。 .*
在这里做同样的事情。
[^$]*
如果你不想匹配美元符号,那很好,否则,我不确定正则表达式引擎会支持这一点。字符类中的$
只是一个美元符号。
\b
在lucene regex中没有支持。整个分析的想法是内容应该已经分开,但是这会有什么用途呢?