Ricerca…


introduzione

Questo è per i lettori che provengono da esperienze relazionali e vogliono imparare elasticsearch. Questo argomento mostra i casi d'uso per i quali i database relazionali non sono un'opzione adatta.

Differenza terminologica

Database relazionale elasticsearch
Banca dati Indice
tavolo genere
Row / Record Documento
Nome colonna campo

Sopra la tabella si disegna approssimativamente un'analogia tra gli elementi di base del database relazionale e elasticsearch.

Impostare

Considerare la struttura seguente in un database relazionale:

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

Equivalente Elasticsearch:

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"           
        }
     }
  ]

Usi in cui i database relazionali non sono adatti

  • L'essenza della ricerca sta nel suo ordine. Tutti vogliono che i risultati della ricerca vengano mostrati in modo tale da mostrare i risultati più adatti. Il database relazionale non ha tale capacità. Elasticsearch d'altra parte mostra i risultati sulla base della pertinenza per impostazione predefinita.

    Impostare

    Come usato nell'esempio precedente.

    Dichiarazione problema

    Supponiamo che l'utente voglia cercare shirts ma è interessato alle camicie red . In tal caso, i risultati contenenti red parola chiave red and shirts dovrebbero apparire in cima. Poi i risultati per altre magliette dovrebbero essere mostrati dopo di loro.

    Soluzione mediante query di database relazionale

    select * from product where name like '%Red%' or name like '%Shirt%' ;

    Produzione

    name       | id 
    -----------+----
    Shirt      |  1
    Red Shirt  |  2
    

    Elasticsearch Solution

    POST test/product/_search
    {
         "query": {
              "match": {
                "name": "Red Shirt"
             }
         }
    }
    

    Produzione

    "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"
         }
      }
     ]
    

    Conclusione

    Come possiamo vedere sopra, il Database relazionale ha restituito i risultati in ordine casuale, mentre Elasticsearch restituisce risultati in ordine decrescente di _score calcolato in base alla pertinenza.


  • Tendiamo a commettere errori mentre inseriamo la stringa di ricerca. Ci sono casi in cui l'utente inserisce un parametro di ricerca errato. I database relazionali non gestiranno tali casi. Elasticsearch in soccorso.

    Impostare

    Come usato nell'esempio precedente.

    Dichiarazione problema

    Supponiamo utente vuole cercare shirts ma lui entra in una parola non corretta shrt per errore. L'utente si aspetta comunque di vedere i risultati della maglietta .

    Soluzione mediante query di database relazionale

    select * from product where name like '%shrt%' ;

    Produzione

    No results found
    

    Elasticsearch Solution

    POST /test/product/_search
    
     {
        "query": {
          "match": {
            "name": {
              "query": "shrt",
              "fuzziness": 2,
              "prefix_length": 0
             }
          }
        }
     }  
    

    Produzione

     "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"
         }
      }
    ]
    

    Conclusione

    Come possiamo vedere sopra il database relazionale non ha restituito risultati per una parola errata cercata, mentre Elasticsearch che utilizza la sua speciale query fuzzy restituisce risultati.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow