Suche…


Einführung

Dies ist für die Leser, die aus einem relationalen Hintergrund kommen und Elasticsearch lernen möchten. In diesem Thema werden die Anwendungsfälle beschrieben, für die relationale Datenbanken keine geeignete Option sind.

Unterschied der Terminologie

Relationale Datenbank Elasticsearch
Datenbank Index
Tabelle Art
Zeile / Aufnahme Dokumentieren
Spaltenname Feld

Die obige Tabelle zeigt grob eine Analogie zwischen grundlegenden Elementen der relationalen Datenbank und der Elasticsearch.

Konfiguration

Betrachten der folgenden Struktur in einer relationalen Datenbank:

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 Äquivalent:

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, bei denen relationale Datenbanken nicht geeignet sind

  • Die Essenz der Suche liegt in ihrer Reihenfolge. Jeder möchte, dass Suchergebnisse so angezeigt werden, dass die besten Ergebnisse oben angezeigt werden. Relationale Datenbanken verfügen nicht über eine solche Fähigkeit. Elasticsearch hingegen zeigt Ergebnisse auf der Grundlage der Standardrelevanz.

    Konfiguration

    Gleich wie im vorherigen Beispiel.

    Problemstellung

    Angenommen, der Benutzer möchte nach shirts suchen, interessiert sich jedoch für red Hemden. In diesem Fall sollten die Ergebnisse mit den Suchbegriffen " red und " shirts an erster Stelle stehen. Danach sollten Ergebnisse für andere Shirts angezeigt werden.

    Lösung mit relationaler Datenbankabfrage

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

    Ausgabe

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

    Elasticsearch Lösung

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

    Ausgabe

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

    Fazit

    Wie wir oben sehen können, hat Relational Database Ergebnisse in einer zufälligen Reihenfolge zurückgegeben, während Elasticsearch Ergebnisse in abnehmender Reihenfolge von _score die auf der Grundlage der Relevanz berechnet wird.


  • Wir neigen dazu, Fehler bei der Eingabe von Suchstrings zu machen. Es gibt Fälle, in denen der Benutzer einen falschen Suchparameter eingibt. Relationale Datenbanken behandeln solche Fälle nicht. Gummiband zur Rettung.

    Konfiguration

    Gleich wie im vorherigen Beispiel.

    Problemstellung

    Angenommen, der Benutzer möchte nach shirts suchen, gibt jedoch versehentlich ein falsches Wort shrt . Der Benutzer erwartet immer noch die Ergebnisse des Shirts .

    Lösung mit relationaler Datenbankabfrage

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

    Ausgabe

    No results found
    

    Elasticsearch Lösung

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

    Ausgabe

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

    Fazit

    Wie wir oben sehen können, hat die relationale Datenbank keine Ergebnisse für ein falsches gesuchtes Wort zurückgegeben, während Elasticsearch mit seiner speziellen fuzzy Abfrage Ergebnisse zurückgibt.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow