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

3

我需要在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个回答

3
您可以使用正则表达式查询来进行IT技术相关的内容搜索。
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进行了分析,则不能使用正则表达式查询进行此类搜索,因为"surface defects"将被拆分为多个术语。好处是,在这种情况下,一个简单的PhraseQuery可能会很好地工作,而且速度更快、更容易(总的来说,在Lucene正则表达式查询方面:您可能不需要它们,如果您需要它们,您可能应该更好地进行分析)。

  • ^$不起作用。您正在尝试匹配术语,并且必须匹配整个术语才能匹配。因此,它们没有任何作用,并且不受支持。

  • .*?不是真正的错误,但是不支持勉强匹配,因此它是多余的。在这里,.*可以做同样的事情。

  • [^$]*如果您试图不匹配美元符号,那么很好,否则,我不确定哪个正则表达式引擎会支持它。字符类中的$只是一个美元符号。

  • \b在Lucene正则表达式中没有支持。分析的整个想法是内容应该已经根据单词断点进行了拆分,所以这有什么作用呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接