2013-08-06 17 views
9

Ho riscontrato alcuni problemi durante l'esecuzione di più richieste get_or_create in ES. Elasticsearch sembra richiedere un po 'di tempo dopo aver risposto allo POST per indicizzare un documento, così tanto che un GET chiamato subito dopo non restituisce risultati.Elasticsearch GET subito dopo POST

Questo esempio riproduce il problema:

curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{ 
    "user" : "kimchy", 
    "post_date" : "2009-11-15T14:12:12", 
    "message" : "trying out Elastic Search" 
}' && \ 
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ 
    "query" : { 
     "term" : { "user" : "kimchy" } 
    } 
}' && \ 
sleep 1 && \ 
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ 
    "query" : { 
     "term" : { "user" : "kimchy" } 
    } 
}' 

Il POST va bene:

{ 
    "ok": true, 
    "_index": "twitter", 
    "_type": "tweet", 
    "_id": "yaLwtgSuQcWg5lzgFpuqHQ", 
    "_version": 1 
} 

Il primo GET non corrisponde alcun risultato:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 0, 
     "max_score": null, 
     "hits": [] 
    } 
} 

E dopo una breve pausa, mostra il risultato (secondo GET):

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.30685282, 
     "hits": [{ 
      "_index": "twitter", 
      "_type": "tweet", 
      "_id": "yaLwtgSuQcWg5lzgFpuqHQ", 
      "_score": 0.30685282, 
      "_source": { 
       "user": "kimchy", 
       "post_date": "2009-11-15T14:12:12", 
       "message": "trying out Elastic Search" 
      } 
     }] 
    } 
} 

è che il comportamento normale?

Esiste la possibilità di ottenere immediatamente il risultato, anche se la risposta è più lenta?

Grazie!

+0

La tua richiesta di indice fa sì che venga creato un nuovo indice giusto? Non lo stai creando in anticipo utilizzando l'API di creazione dell'indice se ho capito correttamente. – javanna

+0

Sì, ma quell'esempio è basato su quelli di Elasticsearch sul documento. Il fatto è che sono felice nel mio ambiente con indici precedentemente creati. Le due persone sottostanti hanno ottenuto buone risposte: utilizzare l'API GET sarebbe più sicuro per un caso del genere. –

+0

Certo, non l'avevo notato, il metodo GET http di capitale mi ha confuso :) come le risposte dicono, usa get o richiama esplicitamente il refresh. Saluti! – javanna

risposta

7

Sì, questo è normale, ricerca elastica per aggiornamenti predefiniti è indici una volta al secondo.

Se avete bisogno di aggiornare immediatamente comprendono aggiornamento = true nell'URL durante l'inserimento di documenti

Dalla documentazione:

aggiornare

Per aggiornare l'indice subito dopo l'operazione si verifica, in modo che il documento venga visualizzato immediatamente nei risultati di ricerca, il parametro di aggiornamento può essere impostato su true. L'impostazione di questa opzione su true dovrebbe essere eseguita SOLO dopo un'attenta analisi e verifica che non porti a prestazioni scadenti, sia dal punto di vista dell'indicizzazione che da quello della ricerca. Nota, ottenere un documento usando l'API get è completamente in tempo reale.

+0

Grazie, mai sentito parlare di questo 1s. Per quanto ne so, l'uso dell'API GET è molto meglio. Troverò un modo per usarlo al posto della ricerca. –

+0

@ Léo L'API get è più lenta della ricerca? –

+0

Nessuna API get è veloce almeno quanto la ricerca (e probabilmente più veloce). Tuttavia, consente di recuperare documenti solo da ID e non consente di effettuare ricerche effettive –

3

Se è necessario l'accesso in tempo reale agli oggetti appena indicizzati, è necessario utilizzare l'API get (http://www.elasticsearch.org/guide/reference/api/get/) e non cercare. La ricerca, come affermato qui, non è in tempo reale. L'API get è. Quindi, se assegni all'ID un oggetto, puoi immediatamente ottenere quell'oggetto tramite ID con l'API get.

0

C'è anche an optimization per disattivare l'indice di ricerca refresh_interval durante l'importazione pesante (come la maggior parte) e rimetterlo al termine. Quindi attendere/dormire alcuni secondi e dovrebbe funzionare. Puoi anche regolare l'intervallo di aggiornamento usando questo (forse non ti interessa e vuoi aggiornarlo solo ogni 15 secondi)