Elasticsearch
Różnica między relacyjnymi bazami danych a Elasticsearch
Szukaj…
Wprowadzenie
To jest dla czytelników, którzy pochodzą z relacyjnych środowisk i chcą nauczyć się elastycznego wyszukiwania. W tym temacie przedstawiono przypadki użycia, dla których relacyjne bazy danych nie są odpowiednią opcją.
Różnica terminologiczna
| Relacyjna baza danych | Elasticsearch |
|---|---|
| Baza danych | Indeks |
| Stół | Rodzaj |
| Wiersz / rekord | Dokument |
| Nazwa kolumny | pole |
Powyższa tabela z grubsza przedstawia analogię między podstawowymi elementami relacyjnej bazy danych a elasticsearch.
Ustawiać
Uwzględnienie następującej struktury w relacyjnej bazie danych:
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
Odpowiednik 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"
}
}
]
Przypadki użycia, w których relacyjne bazy danych nie są odpowiednie
Istota poszukiwań leży w ich kolejności. Wszyscy chcą, aby wyniki wyszukiwania były wyświetlane w taki sposób, aby najlepsze wyniki były wyświetlane u góry. Relacyjna baza danych nie ma takich możliwości. Z drugiej strony Elasticsearch domyślnie pokazuje wyniki na podstawie trafności.
Ustawiać
Taki sam jak w poprzednim przykładzie.
Opis problemu
Załóżmy, że użytkownik chce wyszukać
shirtsale interesują goredkoszule. W takim przypadku wyniki zawierające słowo kluczoweredishirtspowinny znaleźć się na górze. Następnie należy pokazać wyniki dla innych koszul.Rozwiązanie za pomocą kwerendy relacyjnej bazy danych
select * from product where name like '%Red%' or name like '%Shirt%';Wynik
name | id -----------+---- Shirt | 1 Red Shirt | 2Rozwiązanie Elasticsearch
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Wynik
"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" } } ]Wniosek
Jak widać powyżej, relacyjna baza danych zwróciła wyniki w jakiejś losowej kolejności, a Elasticsearch zwraca wyniki w malejącej kolejności
_scorektóra jest obliczana na podstawie trafności.
Podczas wpisywania szukanego ciągu często popełniamy błędy. Zdarzają się przypadki, gdy użytkownik wprowadza nieprawidłowy parametr wyszukiwania. Relacyjne bazy danych nie obsługują takich przypadków. Elasticsearch na ratunek.
Ustawiać
Taki sam jak w poprzednim przykładzie.
Opis problemu
Załóżmy, że użytkownik chce wyszukać
shirtsale przez pomyłkę wpisuje nieprawidłowe słowoshrt. Użytkownik nadal oczekuje wyników koszuli .Rozwiązanie za pomocą kwerendy relacyjnej bazy danych
select * from product where name like '%shrt%';Wynik
No results foundRozwiązanie Elasticsearch
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Wynik
"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" } } ]Wniosek
Jak widać powyżej, relacyjna baza danych nie zwróciła żadnych wyników dla wyszukiwanego niepoprawnego słowa, a Elasticsearch za pomocą specjalnego zapytania
fuzzyzwraca wyniki.