2015-09-17 2 views
1

Мне нужно найти любые термины в индексе lucene, соответствующие определенному регулярному выражению. Я знаю, что я могу сделать это с помощью TermsComponent в Solr, если он configed так:LUCENE: поиск терминов, соответствующих регулярному выражению

<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 

Но мой вопрос, как я могу добиться того же с помощью API Lucene, не Solr? Я заглянул в класс org.apache.solr.handler.component.TermsComponent, но для меня это не очень очевидно.

ответ

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, вы не можете использовать запрос регулярного выражения для поиска, как это, так как «поверхностные дефекты» будут разделены на несколько терминов. С другой стороны, в этом случае простой PhraseQuery, вероятно, будет работать очень хорошо, а также быть быстрее и проще (в общем, по запросам Lucene regex: вам, вероятно, они не нужны, и если вы это сделаете, вы, вероятно, должны лучше проанализировали).

  • ^ и $ не будет работать. Вы пытаетесь сопоставить термины и должны соответствовать всему термину, чтобы соответствовать. Таким образом, они не служат никакой цели и не поддерживаются.

  • .*? не совсем неправильный, но несоответствие соответствия не поддерживается, поэтому оно является излишним. .* делает то же самое здесь.

  • [^$]* если вы пытаетесь не соответствовать знаки доллара, штраф, в противном случае, я не уверен, что движок регулярных выражений бы поддержать это. $ в символьном классе - это знак доллара.

  • \b поддержка не поддерживается в регулярных выражениях lucene. Вся идея анализа состоит в том, что контент уже должен быть разделен на разрывы слов, и какова цель этого?

Смежные вопросы