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 shirts mais qu'il s'intéresse aux chemises de couleur red . Dans ce cas, les résultats contenant red mots-clés red et des shirts doivent 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  |  2
    

    Solution 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 _score calculé 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 incorrect shrt par 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 found
    

    Solution 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 fuzzy spéciale renvoie des résultats.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow