Запрос Elasticsearch не возвращает результаты при запросе по электронной почте

#elasticsearch #kibana

#elasticsearch #kibana

Вопрос:

В индексе elasticsearch у меня есть вызываемое поле reporter , и я не получаю результатов при выполнении этого запроса:

 GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "reporter": "Andr" } }
      ]
    }
  }
}
  

Однако я получаю много результатов, если меняю значение на полное имя «Андре». Как я могу вернуть записи, в которых reporter поле содержит «A», «An», «And», «Andr» и т. Д.? Я получаю результаты только тогда, когда значение соответствует полной строке между периодами в электронном письме.

Вот настройки анализа:

 {
   "analysis": {
      "filter": {
         "email": {
            "type": "pattern_capture",
            "preserve_original": true,
            "patterns": [
               "([^@] )",
               "(\p{L} )",
               "(\d )",
               "@(. )",
               "([^-@] )"
            ]
         }
      },
      "analyzer": {
         "email": {
            "tokenizer": "uax_url_email",
            "filter": [
               "email",
               "lowercase",
               "unique"
            ]
         }
      }
   }
}
  

И вот reporter сопоставление:

 "reporter": {
    "type": "text",
    "analyzer": "email"
}
  

Ответ №1:

Фильтр Edge N-gram может помочь решить ваш вариант использования. Он в основном выводит n-граммы с начала токена. n грамм можно контролировать, установив поля min_gram и max_gram. Мы можем использовать приведенную ниже настройку фильтра для вывода, как требуется для вашего примера, описанного выше.

 "filter": [
    { "type": "edge_ngram",
      "min_gram": 1
    }
  ] 
  

Более подробную информацию можно найти по этой ссылке

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenfilter.html

Комментарии:

1. Итак, я бы использовал этот фильтр вместо фильтра электронной почты? Или в дополнение к нему?

2. зависит от вашего варианта использования. но это должно работать в обоих случаях