Elasticsearch
Skillnaden mellan relationella databaser och Elasticsearch
Sök…
Introduktion
Detta är för läsarna som kommer från relationell bakgrund och vill lära sig elasticsearch. Det här ämnet visar användningsfall där relationsdatabaser inte är ett lämpligt alternativ.
Terminologi skillnad
| Relationsdatabas | Elasticsearch |
|---|---|
| Databas | Index |
| Tabell | Typ |
| Rad / Record | Dokumentera |
| Kolumnnamn | fält |
Ovanför tabellen drar grovt en analogi mellan grundelement i relationell databas och elasticsearch.
Uppstart
Överväger följande struktur i en relationsdatabas:
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"
}
}
]
Användningsområden där relationsdatabaser inte är lämpliga
Essensen av sökning ligger i dess ordning. Alla vill att sökresultaten ska visas på ett sådant sätt att de bäst lämpade resultaten visas ovanpå. Relationsdatabas har inte sådan kapacitet. Elasticsearch å andra sidan visar resultat på grundval av relevans som standard.
Uppstart
Samma som i föregående exempel.
Problemdeklaration
Antag användaren vill söka efter
shirtsmen han är intresserad avredfärgade skjortor. I så fall bör resultat som innehållerredochshirtssökord komma på toppen. Därefter ska resultat för andra skjortor visas efter dem.Lösning med relationell databasfråga
select * from product where name like '%Red%' or name like '%Shirt%';Produktion
name | id -----------+---- Shirt | 1 Red Shirt | 2Elasticsearch Solution
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Produktion
"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" } } ]Slutsats
Som vi kan se ovan har Relational Database returnerat resultat i någon slumpmässig ordning, medan Elasticsearch returnerar resultat i minskande ordning på
_scoresom beräknas på grundval av relevans.
Vi tenderar att göra misstag när vi skriver in söksträng. Det finns fall då användaren anger en felaktig sökparameter. Relationsdatabaser kommer inte att hantera sådana fall. Elasticsearch till undsättning.
Uppstart
Samma som i föregående exempel.
Problemdeklaration
Anta att användaren vill söka efter
shirtsmen hanshrtfelaktigt ordshrtav misstag. Användaren förväntar sig fortfarande att se resultatet av tröjan .Lösning med relationell databasfråga
select * from product where name like '%shrt%';Produktion
No results foundElasticsearch Solution
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Produktion
"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" } } ]Slutsats
Som vi kan se ovan har relationsdatabasen inte returnerat några resultat för ett felaktigt sökat ord, medan Elasticsearch med sin speciella
fuzzyfråga ger resultat.