#performance #elasticsearch #elasticsearch-dsl
Вопрос:
У меня есть индекс Elasticsearch с сотнями миллионов документов, который используется в основном для запросов «получить по идентификатору».
Я рассматриваю возможность добавления маршрута к документам при индексации. Маршрут будет случайным числом от 0 до 9.
Позже этот маршрут будет указан в URL-адресе с идентификатором документа, который будет использоваться для получения документа. В настоящее время у меня есть только идентификаторы документов в URL-адресах, но я также планирую добавлять маршруты. Новый URL-адрес будет выглядеть следующим образом https://tarta.ai/ j/ [маршрут] /[идентификатор документа].
Мне интересно, уменьшит ли это время, необходимое для поиска документа в индексе? Я предлагаю, чтобы Elasticsearch в этом случае не искал документ во всех сегментах, а вместо этого искал только в сегментах с этим конкретным маршрутом.
Некоторые характеристики elasticsearch:
- размер индекса составляет 110 ГБ.
- количество документов составляет 36 миллионов, но мы добавляем сотни тысяч каждый день.
- 5 осколков.
- 16 ГБ оперативной памяти и 2-ядерная виртуальная машина с твердотельным накопителем емкостью 1 т.
Ответ №1:
Маршрутизация особенно полезна при поиске (т. Е. POST index/_search
), потому что вместо поиска по всем сегментам индекса ES будет искать только один сегмент, к которому относится значение маршрутизации.
Если вы указываете routing
значение при индексировании документа, вы ДОЛЖНЫ указать то же значение маршрутизации при получении этого документа, альтернативы нет.
# index with routing
PUT index/_doc/1?routing=123
# returns the document
GET index/_doc/1?routing=123
# returns nothing
GET index/_doc/1
Если вы не укажете какое-либо значение маршрутизации при индексировании документа, ES будет использовать идентификатор в качестве значения маршрутизации и сохранит документ в сегменте, к которому относится это значение маршрутизации. Поэтому при получении такого документа без какого-либо значения маршрутизации ES будет знать, что в качестве значения маршрутизации следует использовать идентификатор, поэтому вам не нужно его указывать (хотя вы могли бы).
# index without routing
PUT index/_doc/1
# returns the document
GET index/_doc/1
# returns the document as well
GET index/_doc/1?routing=1
Это означает, что для операций GET маршрутизация или отсутствие маршрутизации не имеет значения, в основном маршрутизация имеет дополнительную ценность для поиска.
При использовании маршрутизации еще одна вещь, в которой вам нужно убедиться,-это то, что ваши идентификаторы должны быть «хорошо сбалансированы», чтобы их хэш мог разрешиться в любой сегмент с аналогичной вероятностью. Если это не так, вы рискуете создать горячие точки в своем индексе, т. Е. Некоторые осколки могут быть больше, чем другие.
Комментарии:
1. есть какие-нибудь успехи с этим?