Elasticsearch
Différence entre les bases de données relationnelles et Elasticsearch
Recherche…
Introduction
Ceci est pour les lecteurs qui viennent de fond relationnel et veulent apprendre elasticsearch. Cette rubrique présente les cas d'utilisation pour lesquels les bases de données relationnelles ne sont pas une option appropriée.
Différence terminologique
| Base de données relationnelle | Elasticsearch |
|---|---|
| Base de données | Indice |
| Table | Type |
| Rangée / Record | Document |
| Nom de colonne | champ |
Le tableau ci-dessus établit une analogie entre les éléments de base de la base de données relationnelle et elasticsearch.
Installer
Considérant la structure suivante dans une base de données relationnelle:
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 Equivalent:
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"
}
}
]
Cas d'utilisation où les bases de données relationnelles ne conviennent pas
L'essence de la recherche réside dans son ordre. Tout le monde veut que les résultats de recherche soient affichés de manière à ce que les meilleurs résultats soient affichés en haut. La base de données relationnelle n’a pas cette capacité. Elasticsearch, par contre, affiche les résultats sur la base de la pertinence par défaut.
Installer
Identique à celui utilisé dans l'exemple précédent.
Énoncé de problème
Supposons que l'utilisateur veuille chercher des
shirtsmais qu'il s'intéresse aux chemises de couleurred. Dans ce cas, les résultats contenantredmots-clésredet desshirtsdoivent figurer en tête de liste. Ensuite, les résultats des autres chemises doivent être affichés après eux.Solution utilisant une requête de base de données relationnelle
select * from product where name like '%Red%' or name like '%Shirt%';Sortie
name | id -----------+---- Shirt | 1 Red Shirt | 2Solution Elasticsearch
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Sortie
"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" } } ]Conclusion
Comme nous pouvons le voir ci-dessus, la base de données relationnelle a renvoyé des résultats dans un ordre aléatoire, tandis que Elasticsearch renvoie des résultats en ordre décroissant de
_scorecalculé sur la base de la pertinence.
Nous avons tendance à faire des erreurs en entrant la chaîne de recherche. Il y a des cas où l'utilisateur entre un paramètre de recherche incorrect. Les bases de données relationnelles ne gèrent pas de tels cas. Elasticsearch à la rescousse.
Installer
Identique à celui utilisé dans l'exemple précédent.
Énoncé de problème
L' utilisateur veut rechercher On suppose que pour des
shirts, mais il entre un mot incorrectshrtpar erreur. L'utilisateur s'attend toujours à voir les résultats de la chemise .Solution utilisant une requête de base de données relationnelle
select * from product where name like '%shrt%';Sortie
No results foundSolution Elasticsearch
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Sortie
"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" } } ]Conclusion
Comme nous pouvons le voir ci-dessus, la base de données relationnelle n'a renvoyé aucun résultat pour un mot incorrect recherché, tandis qu'Elasticsearch utilisant sa requête
fuzzyspéciale renvoie des résultats.