Elasticsearch
Разница между реляционными базами данных и Elasticsearch
Поиск…
Вступление
Это для читателей, которые исходят из реляционного фона и хотят изучить elasticsearch. В этом разделе показаны примеры использования, для которых реляционные базы данных не являются подходящим вариантом.
Разница терминологии
| Реляционная база данных | Elasticsearch |
|---|---|
| База данных | Индекс |
| Таблица | Тип |
| Строка / запись | Документ |
| Название столбца | поле |
Над таблицей грубо рисуется аналогия между базовыми элементами реляционной базы данных и elasticsearch.
Настроить
Учитывая следующую структуру в реляционной базе данных:
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 Эквивалент:
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, где реляционные базы данных не подходят
Суть поиска лежит в его порядке. Каждый хочет, чтобы результаты поиска отображались таким образом, чтобы наилучшие результаты были показаны сверху. Реляционная база данных не имеет такой возможности. С другой стороны, Elasticsearch показывает результаты на основе релевантности по умолчанию.
Настроить
То же, что используется в предыдущем примере.
Постановка задачи
Предположим, что пользователь хочет найти
shirtsно он заинтересован вredрубашках. В этом случае результаты, содержащие ключевое словоredиshirtsдолжны быть сверху. Затем после них следует показывать результаты для других рубашек.Решение с использованием запроса реляционной базы данных
select * from product where name like '%Red%' or name like '%Shirt%';Выход
name | id -----------+---- Shirt | 1 Red Shirt | 2Решение Elasticsearch
POST test/product/_search { "query": { "match": { "name": "Red Shirt" } } }Выход
"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" } } ]Заключение
Как мы видим выше, реляционная база данных вернула результаты в некотором случайном порядке, в то время как Elasticsearch возвращает результаты в порядке убывания
_scoreкоторый рассчитывается на основе релевантности.
Мы склонны ошибаться при вводе строки поиска. Бывают случаи, когда пользователь вводит неверный параметр поиска. Реляционные базы данных не будут обрабатывать такие случаи. Эластичный поиск на помощь.
Настроить
То же, что используется в предыдущем примере.
Постановка задачи
Предположим , что пользователь хочет найти
shirts, но он входит в неправильное словоshrtпо ошибке. Пользователь все еще ожидает увидеть результаты рубашки .Решение с использованием запроса реляционной базы данных
select * from product where name like '%shrt%';Выход
No results foundРешение Elasticsearch
POST /test/product/_search { "query": { "match": { "name": { "query": "shrt", "fuzziness": 2, "prefix_length": 0 } } } }Выход
"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" } } ]Заключение
Как мы видим выше, реляционная база данных не вернула результатов поиска неправильного слова, в то время как Elasticsearch с использованием своего специального
fuzzyзапроса возвращает результаты.