Поиск…


Вступление

Это для читателей, которые исходят из реляционного фона и хотят изучить 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 запроса возвращает результаты.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow