поиск по шаблону в упругом поиске?

1

Продолжая свой предыдущий пост, я изменил запрос, так как согласно 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
    @funkwurm Я изменил запрос в соответствии с постом femtoRgon, потому что некоторые символы и якоря не поддерживаются эластичным поиском. Так что я здесь с моим обновленным поисковым запросом.
Показать ещё 4 комментария
Теги:
elasticsearch
lucene

2 ответа

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

  • 0
    @Ashish, давайте поговорим об ответе в комментариях к этому ответу: P Из демонстрации Regex101 видно, что он работает со всеми 3 разновидностями regex. Я предполагаю, что проблема FilterBuilder с FilterBuilder или другой частью elastic search .
  • 0
    Хорошо. Да, возможно, проблема в упругом поиске. Я ищу эту проблему. Спасибо за вашу помощь.
Показать ещё 5 комментариев
0

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

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

ИЛИ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню