Elasticsearch
Differenza tra database relazionali ed Elasticsearch
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
shirtsma è interessato alle camiciered. In tal caso, i risultati contenentiredparola chiaveredandshirtsdovrebbero 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 | 2Elasticsearch 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
_scorecalcolato 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
shirtsma lui entra in una parola non correttashrtper 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 foundElasticsearch 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
fuzzyrestituisce risultati.