Elasticsearch: różnica między „Term”, „Dopasuj wyrażenie” i „Ciąg zapytania”

116

Nowość w Elasticsearch i próba lepszego zrozumienia różnicy między tymi zapytaniami. O ile wiem, termdopasowuje pojedynczy termin (czy musi być pisany małą literą, aby dopasowanie działało?) I oba match phrasei query stringdopasowuje ciąg tekstu.

blee908
źródło

Odpowiedzi:

226

termzapytanie pasuje do pojedynczego terminu bez zmian: wartość nie jest analizowana . Więc nie musi być pisane małymi literami w zależności od tego, co zindeksowałeś.

Jeśli podałeś Bennettw czasie indeksowania, a wartość nie jest analizowana, poniższe zapytanie nic nie zwróci:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase zapytanie przeanalizuje dane wejściowe, jeśli dla badanego pola zdefiniowano analizatory i znajdzie dokumenty spełniające następujące kryteria:

  • wszystkie terminy muszą pojawić się w polu
  • muszą mieć tę samą kolejność, co wartość wejściowa

Na przykład, jeśli indeksujesz następujące dokumenty (używając standardanalizatora dla pola foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

To match_phrasezapytanie zwróci tylko pierwszy i drugi dokument:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringwyszukiwanie zapytań domyślnie w polu _all, które zawiera tekst z kilku pól tekstowych jednocześnie. Co więcej, jest analizowany i obsługuje niektóre operatory (AND / OR ...), symbole wieloznaczne i tak dalej (zobacz powiązaną składnię ).

W miarę match_phrasezapytań wejście jest analizowane zgodnie z analizatorem ustawionym na odpytywanym polu.

Inaczej niż w przypadku match_phrase, terminy uzyskane po analizie nie muszą być w tej samej kolejności, chyba że użytkownik użył cudzysłowów wokół danych wejściowych.

Na przykład, używając tych samych dokumentów co poprzednio, zapytanie zwróci wszystkie dokumenty:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Ale to zapytanie zwróci te same 2 dokumenty co match_phrasezapytanie:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Jest znacznie więcej do powiedzenia na temat różnych opcji tych zapytań, zapoznaj się z powiązaną dokumentacją:

Mam nadzieję, że to jest wystarczająco jasne i pomoże.

ThomasC
źródło
Świetne, cudowne i dokładne wyjaśnienie! Jedyne, czego nie jestem pewien, to co dokładnie oznacza analiza ...
blee908
1
Zapraszamy :) Analizatory przetwarzają tekst w celu uzyskania terminów, które są ostatecznie indeksowane / przeszukiwane. Przeczytaj te strony przewodnika ElasticSearch Definitive Guide, ponieważ jest to bardzo ważna koncepcja do zrozumienia.
ThomasC
1
Tak, pochodzi z SQL, jest tu wiele nowych pomysłów. Różnica między zapytaniami a filtrami, dokładnymi wartościami a pełnym tekstem, obiektem wyszukiwania JSON i sposobem, w jaki wyszukiwanie elastyczne wykonuje wyszukiwanie. Tyle do wzięcia !!! Dzięki za zasoby!
blee908
1
@ThomasC Jeśli masz {"foo": "Hello beautiful world"} w swoim indeksie, czy pasujące zapytanie zwróci to?
batmaci
1
@batmaci matchzapytanie używa analizatora, jeśli pole jest analizowane, więc tak. Domyślnie zwróci dokumenty zawierające co najmniej jeden z warunków (patrz parametr operator), a kolejność nie jest ważna.
ThomasC,
17

Myślę, że ktoś zdecydowanie szuka różnic między nimi w odniesieniu do CZĘŚCIOWEGO WYSZUKIWANIA Oto moja analiza z domyślnym „standardowym analizatorem” : -

Załóżmy, że mamy dane: -

{"name": "Hello"}

A co jeśli chcemy przeprowadzić częściowe wyszukiwanie za pomocą ell ???

Zapytanie o termin LUB zapytanie o dopasowanie

{"term":{"name": "*ell*" }

Nie zadziała, zwracam uwagę.

{"term":{"name": "*zz* *ell*" }

Nie zadziała, zwracam uwagę.

Wniosek - termin lub dopasowanie nie może w ogóle przeprowadzić częściowego wyszukiwania

Zapytanie z symbolem wieloznacznym: -

{"wildcard":{"name": "*ell*" }

Będzie działać i da wynik {"name": "Hello"}

{"wildcard":{"name": "*zz* *ell*" }

Nie zadziała, zwracam uwagę.

Wniosek - symbol wieloznaczny jest w stanie przeprowadzić częściowe wyszukiwanie za pomocą tylko jednego tokena

Query_string: -

{"query_string": {"default_field": "name","query": "*ell*"}

Będzie działać i da wynik {"name": "Hello"}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Będzie działać i da wynik {"name": "Hello"}.

Wniosek - query_string może wyszukiwać za pomocą dwóch tokenów

-> tutaj tokenami są ell i zz

Opster Elasticsearch Pro-Vijay
źródło
wildcard is able to do partial search with one token only: dokładniej, wildcardzapytania domyślnie działają tylko na keywordpolach , które z definicji są jednoznakowe. Nie ma to nic wspólnego z tym, że zawartość pola jest więcej niż jednym słowem. W zapytaniu z symbolem wieloznacznym będzie pasować „ozzy hello”.
sox z Moniką