php - tutorial - instalar elasticsearch
Cómo configurar la estructura del índice ElasticSearch con enlaces de entidades múltiples (1)
¡Es un gran comienzo!
Definitivamente lo aplanaría todo (es decir, desnormalizar ) y presentaría documentos de productos que se parecen a los de abajo. De esta forma, se deshace de la relación N: M entre productos y banderas simplemente creando una matriz de flags
para cada producto. Por lo tanto, será más fácil consultar esos indicadores.
{
"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"]
}
El tipo de mapeo del producto se vería así:
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"
}
}
}
}
}
Como ya tiene la entrada logstash jdbc
, lo único que le falta es la consulta SQL adecuada para buscar los productos y los indicadores asociados.
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
Lo cual te daría filas como estas:
+-------------------------------+-------+-------+---------------------+
| id | title | price | flags |
+-------------------------------+-------+-------+---------------------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product |
| 018357657529fef056cf396626812 | Beta | 355 | Discount |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0 | Discount |
+-------------------------------+-------+-------+---------------------+
Usando los filtros de Logstash, puede dividir los flags
en una matriz y listo.
Recientemente comencé a trabajar en la implementación de ElasticSearch (ES) en la aplicación de comercio electrónico heredada escrita en PHP utilizando MySQL. Soy completamente nuevo en todo esto y leer los documentos está bien, pero realmente necesito que alguien con experiencia me aconseje.
De la documentación de ES, pude configurar un nuevo clúster y también descubrí que los ríos están en desuso y deberían reemplazarse, por lo que los reemplacé con Logstash y el conector JDBC MySQL.
En este punto tengo:
- ElasticSearch
- Logstash
- Controlador JDBC MySQL
- Servidor MySQL
La estructura de la base de datos de la aplicación no es realmente óptima y es muy difícil de reemplazar, pero me gustaría replicarla en el índice ES de la mejor manera posible.
Estructura de DB:
Productos
+-------------------------------+-------+--------+
| Id | Title | Price |
+-------------------------------+-------+--------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 |
| 018357657529fef056cf396626812 | Beta | 355,00 |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 |
+-------------------------------+-------+--------+
Banderas
+------------+-------------+
| 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 |
+------+-------------------------------+------------+------------+
Esas ID de cadena son un completo desastre (pero tengo que lidiar con ellas ahora). Al principio, pensé que debería hacer una estructura plana de índice de productos para ES, pero ¿qué pasa con las vinculaciones de múltiples entidades?