#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. зависит от вашего варианта использования. но это должно работать в обоих случаях