Elasticsearch
Verschil tussen relationele databases en Elasticsearch
Zoeken…
Invoering
Dit is voor de lezers die afkomstig zijn uit een relationele achtergrond en die elastische zoekopdrachten willen leren. Dit onderwerp toont de use cases waarvoor relationele databases geen geschikte optie zijn.
Terminologieverschil
| Relationele database | Elasticsearch |
|---|---|
| Database | Inhoudsopgave |
| Tafel | Type |
| Rij / Record | Document |
| Kolomnaam | veld- |
Bovenstaande tabel trekt ruwweg een analogie tussen basiselementen van relationele database en elastisch zoeken.
Opstelling
Overweeg de volgende structuur in een relationele database:
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
Elastiekzoeker gelijkwaardig:
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"
}
}
]
Gebruikssituaties waarbij relationele databases niet geschikt zijn
Essentie van zoeken ligt in zijn volgorde. Iedereen wil dat zoekresultaten zo worden weergegeven dat de best passende resultaten bovenaan worden weergegeven. Relationele databases beschikken niet over dergelijke mogelijkheden. Elasticsearch daarentegen geeft standaard resultaten weer op basis van relevantie.
Opstelling
Hetzelfde als in het vorige voorbeeld.
Probleemstelling
Stel dat gebruiker wil om te zoeken naar
shirtsmaar hij is geïnteresseerd in hetredgekleurde shirts. In dat geval moeten resultaten met het trefwoordredenshirtsbovenaan staan. Dan moeten resultaten voor andere shirts achter hen worden getoond.Oplossing met behulp van relationele databasequery
select * from product where name like '%Red%' or name like '%Shirt%';uitgang
name | id -----------+---- Shirt | 1 Red Shirt | 2Elasticsearch-oplossing
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }uitgang
"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" } } ]Conclusie
Zoals we hierboven kunnen zien, heeft Relationele database resultaten in een willekeurige volgorde geretourneerd, terwijl Elasticsearch resultaten oplevert in afnemende volgorde van
_scoredie wordt berekend op basis van relevantie.
We hebben de neiging om fouten te maken bij het invoeren van de zoekreeks. Er zijn gevallen waarin de gebruiker een onjuiste zoekparameter invoert. Relationele databases zullen dergelijke gevallen niet behandelen. Elasticsearch te hulp.
Opstelling
Hetzelfde als in het vorige voorbeeld.
Probleemstelling
Stel dat de gebruiker naar
shirtswil zoeken, maar dat hij per ongeluk een onjuist woordshrt. Gebruiker verwacht nog steeds de resultaten van het shirt te zien .Oplossing met behulp van relationele databasequery
select * from product where name like '%shrt%';uitgang
No results foundElasticsearch-oplossing
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }uitgang
"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" } } ]Conclusie
Zoals we hierboven kunnen zien, heeft de relationele database geen resultaten opgeleverd voor een gezocht woord, terwijl Elasticsearch met zijn speciale
fuzzyzoekopdracht resultaten oplevert.