Как настроить структуру индекса 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, но как насчет связывания нескольких сущностей?

13

Решение

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

Я бы определенно сгладил все это (т.е. денормализовать) и придумайте документы о продукте, которые выглядят так, как показано ниже. Таким образом, вы избавляетесь от отношений 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 в массив, и вы готовы идти.

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]