Domanda ElasticSearch: impatto dell'impostazione di un campo "not_analyzed" come "store": "yes"?


Supponiamo che abbia un campo stringa specificato come not_analyzed nella mappatura. Se poi aggiungo "store":"yes" alla mappatura, ElasticSearch duplicherà la memoria? La mia comprensione di not_analyzed i campi sono che non vengono eseguiti attraverso un Analizzatore, indicizzati come è, ma un cliente è in grado di eguagliarlo. Quindi, se un campo è entrambi not_analyzed e store:yes, questo potrebbe causare a ElasticSearch di conservare due copie della stringa.

La mia domanda:

  • Se un campo stringa è memorizzato come entrambi not_analyzed e store:yes, ci sarà memoria doppia della stringa?

Spero che sia abbastanza chiaro. Grazie!


33
2018-03-08 17:25


origine


risposte:


Stai mescolando il concetto di campo indicizzato e campo memorizzato in lucene, la libreria su cui elasticsearch è costruita.

Un campo viene indicizzato quando si passa all'interno dell'indice invertito, la struttura dati che lucene utilizza per fornire le sue capacità di ricerca di testo completo grandi e veloci. Se vuoi cercare su un campo, devi indicizzarlo. Quando indicizzi un campo puoi decidere se lo vuoi indicizzare così com'è, o se vuoi analizzarlo, il che significa decidere un tokenizzatore da applicare ad esso, che genererà un elenco di token (parole) e un elenco di token filtri che possono modificare i token generati (anche aggiungere o eliminare alcuni). Il modo in cui indicizzi un campo influisce su come puoi effettuare una ricerca su di esso. Se indicizzi un campo ma non lo analizzi e il suo testo è composto da più parole, sarai in grado di trovare quel documento solo alla ricerca di quel testo specifico esatto, spazi inclusi.

Un campo viene memorizzato quando si desidera poterlo recuperare. Diciamo che Lucene fornisce anche una sorta di memoria, che non ha nulla a che fare con l'indice invertito stesso. Quando esegui una ricerca utilizzando lucene, ottieni un elenco di ID documento corrispondenti. Quindi puoi recuperare del testo dai loro campi memorizzati, che è ciò che stai letteralmente mostrando come risultati di ricerca. Se non archivi un campo non sarai mai in grado di recuperarlo da lucene (questo non è vero per elasticsearch, come spiegherò di seguito).

Puoi avere campi su cui vuoi solo cercare e non mostrare mai: indicizzati e non memorizzati (di default in lucene).
È possibile avere campi che si desidera cercare e anche recuperare: indicizzati e memorizzati.
Puoi avere campi su cui non vuoi cercare, ma vuoi recuperarli per mostrarli.

Pertanto le due strutture dati non sono collegate tra loro. Se entrambi indicizzate e memorizzate un campo in lucene, il suo contenuto non sarà presente due volte nella stessa forma. I campi memorizzati vengono memorizzati così come sono, mentre li si invia a lucene, mentre i campi indicizzati potrebbero essere analizzati e faranno parte dell'indice invertito, che è qualcos'altro. I campi memorizzati vengono creati per essere recuperati per un documento specifico (mediante l'id del documento lucene), mentre i campi indicizzati vengono creati per la ricerca, in una struttura che inverte letteralmente il testo avendo come risultato ogni termine come chiave, insieme a un elenco di documenti id che lo contengono (la lista dei messaggi).

Quando si tratta di elasticsearch, le cose cambiano leggermente. Quando non si configura un campo come memorizzato nella mappatura (l'impostazione predefinita è store:no) è comunque possibile recuperarlo per impostazione predefinita. Ciò accade perché elasticsearch memorizza sempre in lucene l'intero documento sorgente che gli viene inviato (a meno che non si disabiliti questa funzione) all'interno di uno speciale campo lucene, chiamato _fonte.

Quando esegui una ricerca utilizzando elasticsearch, ottieni di default l'intero campo sorgente, ma puoi anche chiedere campi specifici. Quello che succede in quel caso è che elasticsearch controlla se quei campi specifici sono memorizzati o meno in lucene. Se sono il contenuto saranno recuperati da lucene, altrimenti il _source il campo memorizzato verrà recuperato da lucene, analizzato come json (pull parsing) e quei campi specifici verranno estratti. Nel primo caso potrebbe essere un po 'più veloce, ma non necessariamente. Se la tua fonte è veramente grande e vuoi solo caricare un paio di campi, configurarli come memorizzati in lucene probabilmente renderebbe il processo di caricamento più veloce; d'altra parte, se il tuo _source non è così grande e vuoi caricare molti campi, quindi probabilmente è meglio caricare solo un campo memorizzato (il _source), che porterebbe a un singolo disco di ricerca, analizzarlo ecc. Nella maggior parte dei casi, utilizzare il _source il campo funziona bene

Per rispondere alla tua domanda: l'indice invertito e l'archivio di lucene sono due cose completamente diverse. Si finisce per avere due copie degli stessi dati in lucene solo se si decide di memorizzare un campo (store:yes nella mappatura), dal momento che elasticsearch mantiene lo stesso contenuto all'interno di JSON _source, ma questo non ha nulla a che fare con il fatto che stai indicizzando o analizzando il campo.


88
2018-03-10 09:18