Как хранить продукты магазина в Elasticsearch - PullRequest
0 голосов
/ 21 марта 2019

У нас есть интернет-магазин, в котором информация о товаре хранится в трех таблицах:

  1. Продукты (название, описание, марка) - всего 10.000 записей
  2. Варианты продукта (размер, цена, доступность) - всего 80 000 записей
  3. Атрибуты продукта (цвета) - всего 60 000 записей

Это дает в общей сложности около 400 000 предметов.

Пример:

  • Продукт "Nike Air Max"
  • Варианты: «Размер 36, 70 долларов США», «Размер 37, 72 доллара США», «Размер 38, 74 доллара США»
  • Атрибуты «Цвет красный» и «Цвет черный»
  • Всего 6 комбинаций («Nike Air Max + 36 + красный», «Nike Air Max + 36 + черный» ...)

Я ищу способ хранения элементов в упругом виде, чтобы получить лучшую производительность фильтра , для запросов типа " Дайте мне все продукты размером 34 - 37 в цветах красный или оранжевый, стоимостью менее 90 долларов США"

Как мне отразить эту настройку в Elasticsearch, то есть какие индексы я должен создать, чтобы получить оптимальную производительность поиска и фильтрации (производительность индекса не так важна)

Примечание. Я видел такие ключевые слова, как «денормализация», «вложенные документы» и «дочерние документы», но не уверен, какой подход мне следует прочитать и реализовать.

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

У вас есть 2 способа сделать это

  1. создайте один документ по виду обуви (= продукт), каждый из которых будет хранить всю информацию об этом продукте. Это сведет к минимуму количество документов в вашем кластере.

Что-то вроде

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"  }
  1. Создайте один документ по обуви, у вас будет много документов.

.

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"  }

Если вам нужно работать с запросом, как вы сказали, второе решение будет лучше (вам не нужно будет фильтровать вложенные поля, статистика или агрегация будут простыми, а упр сделать поисковик для сайта я думаю это лучше. Если вам нужно сделать статистику или инструменты для бэк-офиса по «Продукту», первая модель может быть лучше.

0 голосов
/ 21 марта 2019

(барабанные дроби ...) Это зависит! Чтобы быть немного более конструктивным, это зависит от того, как вы хотите получить эти продукты. Если вы хотите искать красный, в частности, размер 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 красных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...