Elasticsearch: differenza tra "Termine", "Match Phrase" e "Query String"


116

Nuovo qui per Elasticsearch e cercando di ottenere una migliore comprensione della differenza tra queste query. Per quanto ne so, termcorrisponde a un singolo termine (deve essere minuscolo affinché la corrispondenza funzioni?), Ed entrambi match phrasee query stringcorrisponde a una stringa di testo.

Risposte:


226

termquery corrisponde a un singolo termine così com'è: il valore non viene analizzato . Quindi, non deve essere minuscolo a seconda di ciò che hai indicizzato.

Se hai fornito Bennettal momento dell'indicizzazione e il valore non viene analizzato, la seguente query non restituirà nulla:

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

match_phrase query analizzerà l'input se gli analizzatori sono definiti per il campo interrogato e troverà documenti che soddisfano i seguenti criteri:

  • tutti i termini devono apparire nel campo
  • devono avere lo stesso ordine del valore di input

Ad esempio, se indicizzi i seguenti documenti (utilizzando l' standardanalizzatore per il campo foo):

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

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Questa match_phrasequery restituirà solo il primo e il secondo documento:

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

query_stringricerca query, per impostazione predefinita, su un campo _all che contiene il testo di più campi di testo contemporaneamente. Inoltre, viene analizzato e supporta alcuni operatori (AND / OR ...), caratteri jolly e così via (vedere la sintassi correlata ).

Come le match_phrasequery, l'input viene analizzato in base all'analizzatore impostato nel campo interrogato.

A differenza di match_phrase, i termini ottenuti dopo l'analisi non devono essere nello stesso ordine, a meno che l'utente non abbia utilizzato virgolette attorno all'input.

Ad esempio, utilizzando gli stessi documenti di prima, questa query restituirà tutti i documenti:

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

Ma questa query restituirà gli stessi 2 documenti della match_phrasequery:

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

C'è molto altro da dire sulle diverse opzioni per queste query, dai un'occhiata alla relativa documentazione:

Spero che questo sia abbastanza chiaro e che possa aiutare.


Spiegazione fantastica, meravigliosa e completa! L'unica cosa su cui non sono chiaro è cosa sia o faccia esattamente un'analisi ...
blee908

1
Prego :) Gli analizzatori elaborano il testo per ottenere i termini che vengono infine indicizzati / ricercati. Leggi queste pagine della ElasticSearch Definitive Guide in quanto si tratta di un concetto molto importante da comprendere.
ThomasC

1
Sì, provenendo da SQL, ci sono molte nuove idee qui. La differenza tra query e filtri, valori esatti e testo completo, oggetto di ricerca JSON e solo il modo in cui la ricerca elastica esegue la sua ricerca. COSÌ TANTO DA PRENDERE !!! Grazie per la risorsa!
blee908

1
@ThomasC Se avevi {"foo": "Hello beautiful world"} nel tuo indice, la query di corrispondenza restituirà questo?
batmaci

1
@batmaci una matchquery usa l'analizzatore se il campo viene analizzato, quindi sì. Per impostazione predefinita, restituirà documenti che hanno almeno uno dei termini (vedi parametro operator) e l'ordine non è importante.
ThomasC

17

Penso che qualcuno stia sicuramente cercando differenze tra loro rispetto alla RICERCA PARZIALE Ecco la mia analisi con 'analizzatore standard' predefinito : -

Supponiamo di avere dati: -

{"name": "Hello"}

E se volessimo fare una ricerca parziale con ell ???

Query di termine o query di corrispondenza

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

Non funzionerà, torna annotando.

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

Non funzionerà, torna annotando.

Conclusione - Term or Match non è affatto in grado di eseguire ricerche parziali

Query con caratteri jolly: -

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

Funzionerà dando risultato {"name": "Hello"}

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

Non funzionerà, torna annotando.

Conclusione : il carattere jolly è in grado di eseguire ricerche parziali con un solo token

Stringa della domanda :-

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

Funzionerà dando risultato {"name": "Hello"}

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

Funzionerà dando risultato {"name": "Hello"}.

Conclusione : query_string è in grado di cercare con due token

-> qui i token sono ell e zz


wildcard is able to do partial search with one token only: più precisamente, le wildcardquery di default funzionano solo sui keywordcampi , che sono per definizione single-token. Ciò non ha nulla a che fare con il contenuto del campo costituito da più di una parola. Nella query con caratteri jolly, "ozzy hello" corrisponderebbe.
sox con Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.