2016-06-13 6 views
9

Ho un indice ES con documenti di medie dimensioni (15-30 Mb in più o in meno).Elasticsearch: dimensioni del documento e prestazioni delle query

Ogni documento ha un campo booleano e la maggior parte delle volte gli utenti vogliono solo sapere se un ID documento specifico ha il campo impostato su true.

Le dimensioni del documento influiscono sul rendimento di questa query?

"size": 1, 
    "query": { 
     "term": { 
     "my_field": True 
     } 
    }, 
    "_source": [ 
     "my_field" 
    ] 

E una "dimensione": query 0 risultati prestazioni di tempo migliore?

+0

Non dovresti usare "campi" invece di "_sorgente"? BTW. entrambi i consigli di jordivador nella sua risposta dovrebbero aiutare nelle prestazioni. Se hai l'indice fai dei test per essere sicuro! –

risposta

1

Aggiungendo "size":0 alla vostra richiesta, eviterete un po 'di trasferimento netto questo comportamento migliorerà il vostro tempo di esecuzione.

ma se ho capito il tuo caso di utilizzo, è possibile utilizzare count

Una query di esempio:

curl -XPOST 'http://localhost:9200/test/_count -d '{ 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "id": xxxxx 
       } 
      }, 
      { 
       "term": { 
       "bool_field": True 
       } 
      } 
      ] 
     } 
     } 
    }' 

Con questa query solo controllando se c'è qualche totale, si saprà se un documento con alcuni id hanno impostato il campo bool su true/false a seconda del valore specificato in bool_field alla query. Questo sarà abbastanza veloce.

1

Considerando che Elasticsearch indicizzerà i campi, la dimensione del documento non costituirà un grosso problema per le prestazioni. L'utilizzo della dimensione 0 non influisce sulle prestazioni della query all'interno di Elasticsearch, ma influisce positivamente sulle prestazioni per recuperare il documento in quanto il trasferimento di rete.

Se volete solo controllare un campo booleano per un documento specifico si può semplicemente utilizzare Get API per ottenere il documento appena recuperare il campo che si desidera controllare, in questo modo:

curl -XGET 'http://localhost:9200/my_index/my_type/1000?fields=my_field' 

In questo caso elasticsearch sarà basta recuperare il documento con _id = 1000 e il campo my_field. Quindi puoi controllare il valore booleano.

{ 
    "_index": "my_index", 
    "_type": "my_type", 
    "_id": "1000", 
    "_version": 9, 
    "found": true, 
    "fields": { 
    "my_field": [ 
     true 
    ] 
    } 
} 
1

Osservando la tua domanda, vedo che non hai menzionato la versione elasticsearch che stai utilizzando. Direi che ci sono molti fattori che influenzano le prestazioni di un cluster elasticsearch.

Tuttavia, supponendo che si tratti dell'ultima ricerca elastics e considerando che si sta cercando un singolo valore, l'approccio migliore consiste nel modificare la query in una query di filtraggio senza punteggio. I filtri sono abbastanza veloci in elasticsearch e molto facilmente memorizzati nella cache. Effettuare una query senza punteggio evita completamente la fase di calcolo del punteggio (calcolo della pertinenza, ecc ...).

A a questo:

GET localhost:9200/test_index/test_partition/_search 
{ 
"query" : { 
    "constant_score" : { 
     "filter" : { 
      "term" : { 
       "my_field" : True 
      } 
     } 
    } 
} 

}

Si noti che stiamo usando le API di ricerca. Il costante_score viene utilizzato per convertire il termine query in un filtro, che dovrebbe essere intrinsecamente veloce.

Per ulteriori informazioni. Si prega di fare riferimento