2015-01-14 2 views
1

Продолжая с моего раннего post, я изменил запрос, так как в соответствии с post от femtoRgon некоторые символы и анкеры не поддерживаются поиском упругой информации.образец соответствия в упругом поиске?

Я ищу способ сопоставить шаблон, например, «xxx-xx-xxxx», чтобы искать документы с номерами социального страхования, используя elastic search.

Предположим, что в индексированных документах я хотел бы найти все те документы, которые имеют номера социального страхования, которые соответствуют шаблону «xxx-xx-xxxx».

Пример кода для индексирования документа:

InputStream is = null; 
    try { 
     is = new FileInputStream("/home/admin/Downloads/20121221.doc"); 
     ContentHandler contenthandler = new BodyContentHandler(); 
     Metadata metadata = new Metadata(); 
     Parser parser = new AutoDetectParser(); 
     parser.parse(is, contenthandler, metadata, new ParseContext()); 
     } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     if (is != null) is.close(); 
    } 

Пример кода для поиска

QueryBuilder queryBuilderFullText = null; 
queryBuilderFullText = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), 
         FilterBuilders.regexpFilter("_all", "[0-9]{3}?[0-9]{2}?[0-9]{4}")); 
SearchRequestBuilder requestBuilder; 
      requestBuilder = client.prepareSearch() 
        .setIndices(getDomainIndexId(project)) 
        .setTypes(getProjectTypeId(project)) 
        .setQuery(queryBuilderFullText); 
SearchResponse response = requestBuilder.execute().actionGet(ES_TIMEOUT_MS); 
      SearchHits hits = response.getHits(); 
if (hits.getTotalHits() > 0) { 
System.out.println(hits.getTotalHits()); 
} else { 
       return 0l; 
     } 

Я получаю хиты следующее:

45-555-5462 
457-55-5462 
4578-55-5462 
457-55-54623 
457-55-5462-23 

Но согласно моему требованию, его должен возвращать только «457-55-5462» (на основе соответствия шаблону «xxx-xx-xxxx»).

Пожалуйста, помогите.

+0

возможно дубликат [Как соответствовать шаблону, как «ххх-хх-хххх» для того, чтобы искать документы с номерами социального обеспечения с использованием упругого поиска?] (Http://stackoverflow.com/questions/27922057/how-to-match-the-pattern-like-xxx-xx-xxxx-in-order-to-look-for-documents-with) – funkwurm

+0

@funkwurm Я изменил запрос в соответствии с сообщением femtoRgon потому что некоторые символы и привязки не поддерживаются методом упругого поиска. Поэтому я здесь с обновленным поисковым запросом. –

+0

Да, я заметил, что после пометки, но я не могу отменить флаг, извините за это. Я ответил также, надеюсь, что дает то, что вам нужно :) – funkwurm

ответ

0

Вы забыли добавить - до ? в свое регулярное выражение, а также при необходимости использовать якоря.

"[0-9]{3}-?[0-9]{2}-?[0-9]{4}" 

ИЛИ

"^[0-9]{3}-?[0-9]{2}-?[0-9]{4}$" 
1

Видя, как ^, $ и \d не могут быть использованы, я хотел бы сделать это:

[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-] 

Или в Java:

FilterBuilders.regexpFilter("_all", "[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]")); 

Какие проверки, что до или после найденного номера не являются другими номерами или тире. Для этого требуется символ до и после матча, так что это не будет записывать документы, у которых есть номер социального страхования, как очень начало или очень конец.

Regex101 demo

+0

@ Ашиш, давайте поговорим об ответе в комментариях к этому ответу: P Вы можете увидеть из демонстрации Regex101, что она работает со всеми 3 ароматами регулярных выражений. Я предполагаю, что проблема связана с «FilterBuilder» или другой частью «эластичного поиска». – funkwurm

+0

Хорошо. Да, возможно, проблема заключается в поиске эластичности. Я рассматриваю этот вопрос. Спасибо за вашу помощь. –

+0

Я думаю, что проблема связана с индексированием. Когда он индексируется, он не индексируется как один термин «457-55-5462», а вместо этого в виде трех терминов: «457», «55» и «5462». Вот почему мой термин search не может найти этот термин. «Упругий поиск» удаляет дефисы при индексировании. :( –

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