Sök…


Introduktion

Detta är för läsarna som kommer från relationell bakgrund och vill lära sig elasticsearch. Det här ämnet visar användningsfall där relationsdatabaser inte är ett lämpligt alternativ.

Terminologi skillnad

Relationsdatabas Elasticsearch
Databas Index
Tabell Typ
Rad / Record Dokumentera
Kolumnnamn fält

Ovanför tabellen drar grovt en analogi mellan grundelement i relationell databas och elasticsearch.

Uppstart

Överväger följande struktur i en relationsdatabas:

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 Equivalent:

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"           
        }
     }
  ]

Användningsområden där relationsdatabaser inte är lämpliga

  • Essensen av sökning ligger i dess ordning. Alla vill att sökresultaten ska visas på ett sådant sätt att de bäst lämpade resultaten visas ovanpå. Relationsdatabas har inte sådan kapacitet. Elasticsearch å andra sidan visar resultat på grundval av relevans som standard.

    Uppstart

    Samma som i föregående exempel.

    Problemdeklaration

    Antag användaren vill söka efter shirts men han är intresserad av red färgade skjortor. I så fall bör resultat som innehåller red och shirts sökord komma på toppen. Därefter ska resultat för andra skjortor visas efter dem.

    Lösning med relationell databasfråga

    select * from product where name like '%Red%' or name like '%Shirt%' ;

    Produktion

    name       | id 
    -----------+----
    Shirt      |  1
    Red Shirt  |  2
    

    Elasticsearch Solution

    POST test/product/_search
    {
         "query": {
              "match": {
                "name": "Red Shirt"
             }
         }
    }
    

    Produktion

    "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"
         }
      }
     ]
    

    Slutsats

    Som vi kan se ovan har Relational Database returnerat resultat i någon slumpmässig ordning, medan Elasticsearch returnerar resultat i minskande ordning på _score som beräknas på grundval av relevans.


  • Vi tenderar att göra misstag när vi skriver in söksträng. Det finns fall då användaren anger en felaktig sökparameter. Relationsdatabaser kommer inte att hantera sådana fall. Elasticsearch till undsättning.

    Uppstart

    Samma som i föregående exempel.

    Problemdeklaration

    Anta att användaren vill söka efter shirts men han shrt felaktigt ord shrt av misstag. Användaren förväntar sig fortfarande att se resultatet av tröjan .

    Lösning med relationell databasfråga

    select * from product where name like '%shrt%' ;

    Produktion

    No results found
    

    Elasticsearch Solution

    POST /test/product/_search
    
     {
        "query": {
          "match": {
            "name": {
              "query": "shrt",
              "fuzziness": 2,
              "prefix_length": 0
             }
          }
        }
     }  
    

    Produktion

     "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"
         }
      }
    ]
    

    Slutsats

    Som vi kan se ovan har relationsdatabasen inte returnerat några resultat för ett felaktigt sökat ord, medan Elasticsearch med sin speciella fuzzy fråga ger resultat.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow