Как настроить структуру индекса ElasticSearch с несколькими связями объектов

недавно я начал работать над реализацией ElasticSearch (ES) в унаследованном приложении электронной коммерции, написанном на PHP с использованием MySQL. Я совершенно новичок во всем этом, и чтение документов в порядке, но мне действительно нужен кто-то, кто мог бы мне посоветовать.

Из документации ES я смог настроить новый кластер, и я также узнал, что реки устарели и должны быть заменены, поэтому я заменил их коннектором Logstash и JDBC MySQL.

На данный момент у меня есть:

  • ElasticSearch
  • Logstash
  • Драйвер JDBC MySQL
  • Сервер MySQL

Структура базы данных приложения на самом деле не оптимальна и ее очень сложно заменить, но я бы хотел ее скопировать в индекс ES наилучшим образом.

Структура БД:

Продукты

+-------------------------------+-------+--------+ | Id | Title | Price | +-------------------------------+-------+--------+ | 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 | | 018357657529fef056cf396626812 | Beta | 355,00 | | 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 | +-------------------------------+-------+--------+ 

Флаги

 +------------+-------------+ | Id | Title | +------------+-------------+ | sellout | Sellout | | discount | Discount | | topproduct | Top Product | +------------+-------------+ 

flagsProducts (n: m pivot)

 +------+-------------------------------+------------+------------+ | Id | ProductId | FlagId | ExternalId | +------+-------------------------------+------------+------------+ | 1552 | 00c8234d71c4e94f725cd432ebc04 | sellout | NULL | | 2845 | 00c8234d71c4e94f725cd432ebc04 | topproduct | NULL | | 9689 | 018357657529fef056cf396626812 | discount | NULL | | 4841 | 01a2c32ceeff0fc6b7dd4fc4302ab | discount | NULL | +------+-------------------------------+------------+------------+ 

Эти идентификаторы строк являются полной катастрофой (но я должен иметь дело с ними сейчас). Сначала мне показалось, что я должен делать плоскую структуру индекса продуктов для ES, но как насчет множественных привязок объектов?

Related of "Как настроить структуру индекса ElasticSearch с несколькими связями объектов"

Это отличное начало!

Я бы определенно сгладил все (т. Е. Денормализовал ) и придумал документы с продуктами, которые выглядят так, как показано ниже. Таким образом, вы избавляетесь от отношения N: M между продуктами и флагами, просто создавая для каждого продукта массив flags . Таким образом, будет проще запросить эти флаги.

 { "id": "00c8234d71c4e94f725cd432ebc04", "title": "Alpha", "price": 589.0, "flags": ["Sellout", "Top Product"] } { "id": "018357657529fef056cf396626812", "title": "Beta", "price": 355.0, "flags": ["Discount"] } { "id": "01a2c32ceeff0fc6b7dd4fc4302ab", "title": "Gamma", "price": 0.0, "flags": ["Discount"] } 

Тип отображения продукта будет выглядеть так:

 PUT products { "mappings": { "product": { "properties": { "id": { "type": "string", "index": "not_analyzed" }, "title": { "type": "string" }, "price": { "type": "double", "null_value": 0.0 }, "flags": { "type": "string", "index": "not_analyzed" } } } } } 

Поскольку у вас уже есть вход в logstash jdbc , все, что вам не хватает, это правильный запрос SQL для извлечения продуктов и связанных с ними флагов.

  SELECT p.Id as id, p.Title as title, p.Price as price, GROUP_CONCAT(f.Title) as flags FROM Products p JOIN flagsProducts fp ON fp.ProductId = p.Id JOIN Flags f ON fp.FlagId = f.id GROUP BY p.Id 

Что бы получить такие строки:

 +-------------------------------+-------+-------+---------------------+ | id | title | price | flags | +-------------------------------+-------+-------+---------------------+ | 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product | | 018357657529fef056cf396626812 | Beta | 355 | Discount | | 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0 | Discount | +-------------------------------+-------+-------+---------------------+ 

Используя фильтры Logstash, вы можете разделить flags на массив, и вам хорошо идти.