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 shirts pero está interesado en camisas de color red . En ese caso, los resultados que contengan palabras clave de red y shirts deben 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  |  2
    

    Solució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 _score que 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 shirts pero él entra en una palabra incorrecta shrt por 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 found
    

    Solució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 fuzzy especial devuelve resultados.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow