Elasticsearch
Unterschied zwischen relationalen Datenbanken und Elasticsearch
Suche…
Einführung
Dies ist für die Leser, die aus einem relationalen Hintergrund kommen und Elasticsearch lernen möchten. In diesem Thema werden die Anwendungsfälle beschrieben, für die relationale Datenbanken keine geeignete Option sind.
Unterschied der Terminologie
| Relationale Datenbank | Elasticsearch |
|---|---|
| Datenbank | Index |
| Tabelle | Art |
| Zeile / Aufnahme | Dokumentieren |
| Spaltenname | Feld |
Die obige Tabelle zeigt grob eine Analogie zwischen grundlegenden Elementen der relationalen Datenbank und der Elasticsearch.
Konfiguration
Betrachten der folgenden Struktur in einer relationalen Datenbank:
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 Äquivalent:
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"
}
}
]
Usecases, bei denen relationale Datenbanken nicht geeignet sind
Die Essenz der Suche liegt in ihrer Reihenfolge. Jeder möchte, dass Suchergebnisse so angezeigt werden, dass die besten Ergebnisse oben angezeigt werden. Relationale Datenbanken verfügen nicht über eine solche Fähigkeit. Elasticsearch hingegen zeigt Ergebnisse auf der Grundlage der Standardrelevanz.
Konfiguration
Gleich wie im vorherigen Beispiel.
Problemstellung
Angenommen, der Benutzer möchte nach
shirtssuchen, interessiert sich jedoch fürredHemden. In diesem Fall sollten die Ergebnisse mit den Suchbegriffen "redund "shirtsan erster Stelle stehen. Danach sollten Ergebnisse für andere Shirts angezeigt werden.Lösung mit relationaler Datenbankabfrage
select * from product where name like '%Red%' or name like '%Shirt%';Ausgabe
name | id -----------+---- Shirt | 1 Red Shirt | 2Elasticsearch Lösung
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Ausgabe
"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" } } ]Fazit
Wie wir oben sehen können, hat Relational Database Ergebnisse in einer zufälligen Reihenfolge zurückgegeben, während Elasticsearch Ergebnisse in abnehmender Reihenfolge von
_scoredie auf der Grundlage der Relevanz berechnet wird.
Wir neigen dazu, Fehler bei der Eingabe von Suchstrings zu machen. Es gibt Fälle, in denen der Benutzer einen falschen Suchparameter eingibt. Relationale Datenbanken behandeln solche Fälle nicht. Gummiband zur Rettung.
Konfiguration
Gleich wie im vorherigen Beispiel.
Problemstellung
Angenommen, der Benutzer möchte nach
shirtssuchen, gibt jedoch versehentlich ein falsches Wortshrt. Der Benutzer erwartet immer noch die Ergebnisse des Shirts .Lösung mit relationaler Datenbankabfrage
select * from product where name like '%shrt%';Ausgabe
No results foundElasticsearch Lösung
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Ausgabe
"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" } } ]Fazit
Wie wir oben sehen können, hat die relationale Datenbank keine Ergebnisse für ein falsches gesuchtes Wort zurückgegeben, während Elasticsearch mit seiner speziellen
fuzzyAbfrage Ergebnisse zurückgibt.