#elasticsearch
#elasticsearch
Вопрос:
У нас есть интернет-магазин, который хранит сведения о товарах в трех таблицах:
- Товары (название, описание, бренд) — всего 10000 записей
- Варианты товаров (размер, цена, доступность) — всего 80 000 записей
- Атрибуты продукта (цвета) — всего 60 000 записей
Это дает общую комбинацию из примерно 400 000 наименований.
Пример:
- Товар «Nike Air Max»
- Возможны варианты «Размер 36, 70 долларов США», «Размер 37, 72 доллара США», «Размер 38, 74 доллара США»
- Атрибутами являются «Красный цвет» и «Черный цвет»
- Всего 6 комбинаций («Nike Air Max 36 красный», «Nike Air Max 36 черный» …)
Я ищу способ хранить элементы в Elastic, чтобы получить наилучшую производительность фильтра для запросов типа «Дайте мне все товары размером 34-37, красного или оранжевого цвета, стоимостью менее 90 долларов США«.
Как я должен отразить эту настройку в Elasticsearch, т. Е. какие индексы я должен создать, чтобы получить оптимальную производительность поиска и фильтрации (производительность индекса не так важна)
Примечание: Я видел такие ключевые слова, как «денормализация», «вложенные документы» и «дочерние документы», но не уверен, какой подход мне следует подробнее изучить и внедрить.
Ответ №1:
У вас есть 2 способа сделать это
- создайте один документ по типу обуви (= Товар), в каждом из них будет храниться вся информация об этом товаре. Это сведет к минимуму количество документов в вашем кластере.
Что-то вроде
shoes
"name": { "type": "keyword" },
"brand": { "type": "keyword" },
"Description": {
"type": "string",
"index": "not_analyzed"
}
nested:
variant:
size: { "type": "integer" },
price: { "type": "float" },
availability: { "type": "integer" },
colors: { "type": "keyword" }
- Создайте один документ по обуви, у вас будет много документов.
.
shoes
"name": { "type": "keyword" },
"brand": { "type": "keyword" },
"Description": {
"type": "string",
"index": "not_analyzed"
}
size: { "type": "integer" },
price: { "type": "float" },
availability: { "type": "integer" },
colors: { "type": "keyword" }
Если вам нужно работать с запросом, как вы сказали, второе решение было бы лучше (вам не придется фильтровать вложенные поля, статистика или агрегирование будут простыми, а для elasticsearch будет достаточно 400 тыс. элементов), если вы хотите создать поисковую систему для веб-сайта, я думаю, что это лучше. Если вам нужно создать статистику или инструменты бэк-офиса по «Продукту», первая модель может быть лучше.
Ответ №2:
(барабанная дробь …) Это зависит! Если быть немного более конструктивным, это зависит от того, как вы хотите извлекать эти товары. Если вы хотите найти конкретно красный размер 40, вам, вероятно, понадобятся вложенные документы. Вот краткий пример:
{"name":"Air max", variants: [{color:"red", size:"36"}, {color:"black", size:"40"}]}
Теперь, если мы учтем, что варианты являются вложенными документами, и вы все еще ищете красный размер 40, тогда ES корректно вернет 0 результатов.
Без вложенных документов внутренний индекс будет выглядеть примерно так:
{"name":"Air max", variants.color:"red" "black", variants.size:"36" "40"}
И с такой структурой данных ES вернет вам документ красного цвета 40-го размера.
Комментарии:
1. Теперь, если вы действительно хотите использовать вложенные документы, имейте в виду, что это сопряжено с некоторыми недостатками с точки зрения производительности, совместимости с различным программным обеспечением, связанным с ES (глядя на вас, Kibana), …