Elasticsearch
Diferencia entre bases de datos relacionales y elasticsearch
Buscar..
Introducción
Esto es para los lectores que provienen de antecedentes relacionales y desean aprender la búsqueda de elastics. Este tema muestra los casos de uso para los cuales las bases de datos relacionales no son una opción adecuada.
Terminología diferencia
| Base de datos relacional | Elasticsearch |
|---|---|
| Base de datos | Índice |
| Mesa | Tipo |
| Fila / Grabar | Documento |
| Nombre de columna | campo |
Sobre la tabla, aproximadamente se dibuja una analogía entre los elementos básicos de la base de datos relacional y la búsqueda de elastics.
Preparar
Teniendo en cuenta la siguiente estructura en una base de datos relacional:
create databse test;
use test;
create table product;
create table product (name varchar, id int PRIMARY KEY);
insert into product (id,name) VALUES (1,'Shirt');
insert into product (id,name) VALUES (2,'Red Shirt');
select * from product;
name | id
----------+----
Shirt | 1
Red Shirt | 2
Elasticsearch Equivalente:
POST test/product
{
"id" : 1,
"name" : "Shirt"
}
POST test/product
{
"id" : 2,
"name" : "Red Shirt"
}
GET test/product/_search
"hits": [
{ ==============
"_index": "test", ===> index |
"_type": "product", ===>type |
"_id": "AVzglFomaus3G2tXc6sB", |
"_score": 1, |
"_source": { |===> document
"id": 2, ===>field |
"name": "Red Shirt" ===>field |
} |
}, ==============
{
"_index": "test",
"_type": "product",
"_id": "AVzglD12aus3G2tXc6sA",
"_score": 1,
"_source": {
"id": 1,
"name": "Shirt"
}
}
]
Casos de uso donde las bases de datos relacionales no son adecuadas
La esencia de la búsqueda reside en su orden. Todos quieren que los resultados de la búsqueda se muestren de tal manera que los mejores resultados se muestren en la parte superior. La base de datos relacional no tiene tal capacidad. Elasticsearch, por otro lado, muestra resultados en base a la relevancia por defecto.
Preparar
Igual que el utilizado en el ejemplo anterior.
Planteamiento del problema
Supongamos que el usuario quiere buscar
shirtspero está interesado en camisas de colorred. En ese caso, los resultados que contengan palabras clave deredyshirtsdeben aparecer en la parte superior. Luego se mostrarán los resultados de otras camisetas.Solución mediante consulta de base de datos relacional
select * from product where name like '%Red%' or name like '%Shirt%';Salida
name | id -----------+---- Shirt | 1 Red Shirt | 2Solución de Elasticsearch
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Salida
"hits": [ { "_index": "test", "_type": "product", "_id": "AVzglFomaus3G2tXc6sB", "_score": 1.2422675, ===> Notice this "_source": { "id": 2, "name": "Red Shirt" } }, { "_index": "test", "_type": "product", "_id": "AVzglD12aus3G2tXc6sA", "_score": 0.25427115, ===> Notice this "_source": { "id": 1, "name": "Shirt" } } ]Conclusión
Como podemos ver arriba, la base de datos relacional ha arrojado resultados en un orden aleatorio, mientras que Elasticsearch devuelve los resultados en orden decreciente de
_scoreque se calcula sobre la base de la relevancia.
Tendemos a cometer errores al introducir la cadena de búsqueda. Hay casos en que el usuario ingresa un parámetro de búsqueda incorrecto. Las bases de datos relacionales no manejarán tales casos. Elasticsearch al rescate.
Preparar
Igual que el utilizado en el ejemplo anterior.
Planteamiento del problema
Supongamos que el usuario quiere buscar
shirtspero él entra en una palabra incorrectashrtpor error. El usuario aún espera ver los resultados de la camiseta .Solución mediante consulta de base de datos relacional
select * from product where name like '%shrt%';Salida
No results foundSolución de Elasticsearch
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Salida
"hits": [ { "_index": "test", "_type": "product", "_id": "AVzglD12aus3G2tXc6sA", "_score": 1, "_source": { "id": 1, "name": "Shirt" } }, { "_index": "test", "_type": "product", "_id": "AVzglFomaus3G2tXc6sB", "_score": 0.8784157, "_source": { "id": 2, "name": "Red Shirt" } } ]Conclusión
Como podemos ver arriba, la base de datos relacional no ha devuelto resultados por una palabra incorrecta buscada, mientras que Elasticsearch que usa su consulta
fuzzyespecial devuelve resultados.