2013-06-14 13 views
53

Io davvero non capisco perché in core types link si dice nelle descrizioni attributi (per un numero, per esempio):Perché ho bisogno di "memorizzare": "sì" in elasticsearch?

  1. negozio - Impostare a yes per memorizzare campo effettiva nell'indice, non di non conservarlo . Il valore predefinito è no (nota, il documento JSON stesso è memorizzato e può essere recuperato da esso)
  2. index - Impostare su no se il valore non deve essere indicizzato. In questo caso, negozio dovrebbe essere impostata su yes, poiché se non è indicizzato e non memorizzata, non c'è niente a che fare con esso

Le due parti in grassetto sembrano contraddirsi. Se "index":"no", "store":"no" potrei ancora ottenere il valore dalla fonte. Questo potrebbe essere un buon uso se ho un campo che contiene un URL per esempio. No?

Ho avuto un piccolo esperimento, in cui ho avuto due mappature, in uno un campo è stato impostato su "store":"yes" e nell'altro a "store":"no".

In entrambi i casi ho potuto ancora specificare nella mia domanda:

{"query":{"match_all":{}}, "fields":["my_test_field"]} 

e ho avuto la stessa risposta, restituendo il campo.

ho pensato che se "store" è impostato su "no" vorrebbe dire non ho potuto prelevare il campo specifico, ma ha dovuto ottenere l'intera _source e analizzarlo sul lato client.

Quindi, quali sono i vantaggi nell'impostazione di "store" in "yes"? È rilevante solo se escludo esplicitamente il campo dal campo "_source"?

risposta

99

ho pensato che se "store" è impostato su "no" significherebbe non ho potuto recuperare il campo specifico, ma ha dovuto ottenere l'intera sorgente_ e analizzarlo sul lato client.

Questo è esattamente ciò che fa per voi elasticsearch quando un campo non viene memorizzato (default) e il campo _source è abilitato (impostazione predefinita troppo).

Generalmente si invia un campo a elasticsearch perché si desidera eseguire la ricerca su di esso o recuperarlo. Ma è vero che se non si memorizza il campo esplicitamente e non si disabilita la fonte, è comunque possibile recuperare il campo utilizzando lo _source. Ciò significa che in alcuni casi potrebbe avere senso avere un campo che non è indicizzato né memorizzato.

Quando si memorizza un campo, ciò avviene nel lucene sottostante. Lucene è un indice invertito, che consente una ricerca veloce a tutto testo e restituisce gli ID dei documenti con query di testo. Oltre l'indice invertito Lucene ha una sorta di memoria in cui i valori dei campi possono essere memorizzati per essere recuperati dato un documento id. Di solito si memorizzano in lucene i campi che si desidera restituire come risultati di ricerca. Elasticsearch non richiede di archiviare tutti i campi che vuoi restituire perché memorizza sempre per impostazione predefinita ogni documento che gli viene inviato, quindi è sempre in grado di restituire tutto ciò che hai inviato come risultato della ricerca.

In alcuni casi potrebbe essere utile memorizzare i campi esplicitamente in lucene: quando il campo _source è disabilitato o quando si desidera evitare di analizzarlo, anche se l'analisi viene eseguita automaticamente da elasticsearch. Tenete presente che il recupero di molti campi memorizzati da lucene potrebbe richiedere una ricerca disco per campo mentre con il recupero solo di _source da lucene e l'analisi per recuperare i campi necessari è solo una ricerca disco singolo e solo più veloce nella maggior parte casi.

+1

È splendido! Grazie per la spiegazione. – eran

+1

"Ricorda però che il recupero di molti campi memorizzati da lucene potrebbe richiedere una ricerca disco per campo mentre con il recupero solo di _source da lucene e l'analisi per recuperare i campi necessari è solo una ricerca su disco e più veloce nella maggior parte di i casi. " Dato che l'SSD è utilizzato per memorizzare l'indice, l'effetto della diminuzione del numero di ricerche è evidente? "Negli HDD questo è in genere compreso tra 0,2 e 0,8 ms. Gli SSD tipici hanno un tempo di ricerca compreso tra 0,08 e 0,16 ms." –

+4

È anche utile memorizzare esplicitamente i campi che non vengono restituiti in _source. I timestamp sono un esempio. Anche se li hai abilitati su un tipo, non sarai in grado di recuperarli ("campi": ["_timestamp"] non restituirà nulla) a meno che tu non abbia "_timestamp": {"store": true} in la tua mappatura per quel tipo. – csjacobs24

2

Per impostazione predefinita in elasticsearch, viene memorizzata la _source (il documento indicizzato). Ciò significa che quando esegui una ricerca, puoi recuperare la fonte del documento. Inoltre, elasticsearch estrae automaticamente campi/oggetti da _source e li restituisce se lo chiedi esplicitamente (e se possibile utilizzarlo anche in altri componenti, come l'evidenziazione).

È possibile specificare che venga memorizzato anche un campo specifico. Ciò significa che i dati per quel campo verranno memorizzati "da solo". Significa che se chiedete "campo1" (che è memorizzato), elasticsearch identificherà quello memorizzato e lo caricherà dall'indice invece di ottenerlo da _source (supponendo che _source sia abilitato).

Quando si desidera abilitare la memorizzazione di campi specifici? La maggior parte delle volte non lo fai. Il recupero di _source è veloce e anche l'estrazione è veloce. Se si dispone di documenti molto grandi, in cui il costo di archiviazione di _source o il costo di analisi di _source è elevato, è possibile mappare esplicitamente alcuni campi da archiviare.

Nota, c'è un costo per il recupero di ogni campo memorizzato. Quindi, ad esempio, se hai un json con 10 campi di dimensioni ragionevoli e li mappali tutti come memorizzati, e chiedi tutti loro, questo significa caricarli tutti (più ricerche disco), rispetto al solo caricamento di _source (che è un campo, possibilmente compresso).

Ho ottenuto questa risposta sul link di seguito risposto da shay.banon puoi leggere questo thread intero per ottenere una buona comprensione su di esso. enter link description here

+0

Si prega di non copiare/incollare la stessa risposta a più domande (http://stackoverflow.com/a/38787655/466738, http://stackoverflow.com/a/38787619/466738).Se ritieni che le domande riguardino la stessa cosa, contrassegnali come chiuse (http://stackoverflow.com/help/duplicates) –

Problemi correlati