2012-11-29 17 views

risposta

24

Per impostazione predefinita tutti i campi sono indicizzati all'interno del campo speciale _all, che fornisce la cosiddetta funzione di catchall out of the box. Tuttavia, è possibile specificare per ogni campo nella vostra mappatura se si desidera aggiungere al campo _all o no, attraverso l'opzione include_in_all:

"person" : { 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes", "include_in_all" : false 
     } 
    } 
} 

L'esempio sopra disabilita il comportamento predefinito per il campo del nome, che ha vinto far parte di tutto il campo

In caso contrario, se non è necessario il campo _all a tutti per un tipo specifico è possibile disattivare in questo modo, ancora una volta nella vostra mappatura:

"person" : { 
    "_all" : {"enabled" : false}, 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes" 
     } 
    } 
} 

Quando si disattiva che i vostri campi sarà ancora indicizzati separatamente, ma non avrai la funzione di catchall che _all fornisce. Dovrai quindi interrogare i tuoi campi specifici invece di fare affidamento sul campo _all speciale, il gioco è fatto. Infatti, quando si esegue una query e non si specifica un campo, elasticsearch interroga il campo _all sotto il cofano, a meno che non si sostituisca il campo predefinito per eseguire una query.

+0

Grazie per quello! Quindi posso disabilitare '_all' dato che non sto usando quella funzione e spero che questo riduca la dimensione dell'indice. E, se ho capito bene, l'unica altra opzione per ridurre la dimensione dell'indice che ho è di specificare 'not_analyzed' sui campi su cui non cerco? – Michael

+2

Beh, non è solo per cambiare la dimensione dell'indice ... cambia il modo in cui i dati sono indicizzati.Se non si analizza un campo, questo conterrà un singolo token. Non verranno utilizzati tokenizer o filtri token. Se contiene una frase (con spazi bianchi, ecc.), Per avere una corrispondenza su di essa è necessario interrogare per l'intera frase esatta. Se non si interroga mai un campo, è sufficiente impostare indexed = false. – javanna

+0

Sì, è quello che pensavo. Grazie per la spiegazione. Ho alcuni campi nei miei documenti come "descrizione" o "link" che non ho mai bisogno di cercare, quindi è uno spreco di risorse per analizzarli. E sto testando l'esecuzione dell'intero indice in memoria ('{" index ": {" store.type ":" memoria "}}') così la dimensione dell'indice diventerà un fattore importante. – Michael

6

Ogni campo stringa ha il parametro index nella configurazione di mappatura, che è defaults toanalyzed. Ciò significa che, oltre al campo all, ogni campo è solo indicizzato.

E per il _all field si dice in riferimento che:

Per impostazione predefinita, è abilitata e tutti i campi sono inclusi in esso per la facilità d'uso.

Quindi, per l'indicizzazione disabilitare completamente per un campo è necessario specificare (se il campo _all è abilitato):

"mappings": { 
     "your_mapping": { 
      "properties": { 
       "field_not_to_index": { 
        "type": "string", 
        "include_in_all": false, 
        "index": "no" 
       } 
      } 
     } 
    } 

Per i campi che dovrebbero essere interrogati dal fatto che essi includono nel campo _all (con "index": "no" per risparmiare risorse) se si esegue una query attraverso il campo _all o se si esegue una query su tali campi utilizzare esclusivamente il parametro index con qualsiasi valore positivo (analyzed o not_analyzed) e disabilitare il campo _all per salvare le risorse.

2

seguito è riportato un importante pagina doc per capire le impostazioni dell'indice in elasticsearch http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html

per il vostro problema, idealmente si dovrebbe impostare il flag "indice" per non nei proprietà del campo.

+1

In quel link, l'esempio mostra "index": "not_analyzed". Ma ho pensato che l'indicizzazione e l'analisi siano concetti distinti in ES? 'No' non è un'impostazione diversa da 'not_analyzed'? Si prega di precisare. – szeitlin

+2

'analizzato' Prima analizzare la stringa e indicizzarla. In altre parole, indicizza questo campo come testo completo. 'not_analyzed' Indicizza questo campo, quindi è ricercabile, ma indicizza il valore esattamente come specificato. Non analizzarlo. 'no' Non indicizzare questo campo. Questo campo non sarà ricercabile. – Tjorriemorrie

Problemi correlati