LUCENE:搜索与正则表达式匹配的术语

时间:2015-09-17 15:16:26

标签: solr lucene

我需要搜索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课程,但对我来说不是很明显。

1 个答案:

答案 0 :(得分:2)

您可以使用RegexQuery

Query query = new RegexQuery(new Term("myField", myRegex));

QueryParser

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中没有支持。整个分析的想法是内容应该已经分开,但是这会有什么用途呢?