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.