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ć shirts ale interesują go red koszule. W takim przypadku wyniki zawierające słowo kluczowe red i shirts powinny 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  |  2
    

    Rozwią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 _score któ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ć shirts ale przez pomyłkę wpisuje nieprawidłowe słowo shrt . 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 found
    

    Rozwią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 fuzzy zwraca wyniki.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow