#elasticsearch #spatial-index
#elasticsearch #пространственный индекс
Вопрос:
Я выполняю запрос по более чем 140 миллионам документов с пространственными данными. Чисто пространственные запросы выполняются очень быстро (менее 1 секунды). Добавление подстановочного знака к той же геометрии приводит к тому, что запрос занимает ~ 10-20 секунд. Я ожидаю, что запросы с подстановочными знаками займут некоторое время, но я хочу знать, есть ли лучший способ написать запрос или обмануть Elasticsearch, отфильтровав результаты только по геометрии, а затем найдя совпадения с подстановочными знаками. Или, может быть, запустить пространственный запрос, а затем запустить подстановочный знак для результирующих идентификаторов документов? Мы будем признательны за любые идеи, которые могут привести к более быстрым результатам для конечного пользователя.
GET parcels/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"name.keyword": {
"value": "*smith*"
}
}
},
{
"bool": {
"filter": [
{
"geo_shape": {
"shape": {
"shape": {
"type": "POLYGON",
"coordinates": [
[
[
-81.09980486601305,
32.063655184739936
],
[
-81.09980486601168,
32.05639855631687
],
[
-81.09128330779276,
32.05639855631687
],
[
-81.09128330779276,
32.06365489826756
],
[
-81.09980486601305,
32.063655184739936
]
]
]
},
"relation": "intersects"
}
}
}
]
}
}
]
}
},
"size": 10000
}
наши настройки для индекса:
{
...
"analysis": {
"normalizer": {
"search_normalizer": {
"filter": [
"uppercase"
],
"type": "custom"
}
}
},
"number_of_shards": 8,
"number_of_replicas": 1,
сопоставление для поля «имя»:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "search_normalizer"
}
}
},
Запуск ES 7.10. (5 узлов, каждый с 8 ГБ оперативной памяти)
Отказ от поиска по шаблону — это не вариант.
Любая помощь приветствуется.
Ответ №1:
Использование поиска по шаблону с префиксом подстановочного знака (как в *smith*
) в keyword
поле снижает производительность!
Если вам абсолютно необходима такая функциональность, вам нужно использовать новый wildcard
тип поля, который предназначен именно для такого использования.
Таким образом, вы можете либо добавить другое подполе, либо изменить keyword
подполе на a ?подполе «подстановочный знак».
Вы можете увидеть, как это работает под капотом, в статье блога, где было описано подстановочное поле, когда оно появилось.
Комментарии:
1. Не знаю, как я пропустил эту потрясающую функцию в примечаниях к выпуску… Спасибо! Я попробую это сделать.
2. Я протестировал это на подмножестве данных, и это было значительное улучшение (~ в 5 раз). Мне пришлось добавить недокументированный параметр ‘case_insensitive’ для репликации текущей функциональности. Я добавлю его к полному набору данных после переиндексации. Еще раз спасибо.
3. Потрясающе, рад, что это обеспечило значительное улучшение!