2013-08-06 12 views
9

Ich habe einige Probleme bei der Durchführung mehrere get_or_create Anfragen an ES. Elasticsearch scheint nach der Reaktion auf die POST eine Weile zu dauern, um ein Dokument zu indizieren, so viel, dass GETkurz nach keine Ergebnisse zurückgibt.Elasticsearch GET nur nach POST

Dieses Beispiel reproduziert das Problem:

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" } 
    } 
}' 

Die POST gut geht:

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

Der erste GET passt nicht jedes Ergebnis:

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

Und nach einer kurze Pause, zeigt das Ergebnis (zweite 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" 
      } 
     }] 
    } 
} 

Ist das Verhalten normal?

Gibt es eine Möglichkeit, das Ergebnis sofort zu erhalten, auch wenn die Antwort langsamer ist?

Danke!

+0

Ihre Indexanforderung verursacht, dass ein neuer Index erstellt wird, richtig? Sie erstellen es nicht im Voraus mit dem create index api, wenn ich es richtig verstanden habe. – javanna

+0

Ja, aber dieses Beispiel basiert auf denen von Elasticsearch im Dokument. Tatsache ist, dass dies in meiner Umgebung mit zuvor erstellten Indizes passiert ist. Die beiden unten genannten Personen haben gute Antworten gegeben: Die Verwendung der GET-API wäre in einem solchen Fall sicherer. –

+0

Sicher, das hatte ich nicht bemerkt, die Hauptstadt http GET-Methode verwirrte mich :) wie die Antworten sagen, benutze get oder explizit Call Refresh. Prost! – javanna

Antwort

7

Ja das ist normal, elastische Suche standardmäßig aktualisiert seine Indizes einmal pro Sekunde.

Wenn Sie es brauchen sofort zu aktualisieren sind refresh = true in der URL, wenn Dokumente Einfügen

Aus der Dokumentation:

aktualisieren

Um den Index unmittelbar nach der Operation zu aktualisieren auftritt, damit das Dokument sofort in den Suchergebnissen angezeigt wird, kann der Refresh-Parameter auf true gesetzt werden. Wenn Sie diese Option auf "true" setzen, sollten Sie NUR nach sorgfältiger Überlegung und Überprüfung sicherstellen, dass dies nicht zu einer schlechten Leistung führt, sowohl bei der Indexierung als auch bei der Suche. Beachten Sie, dass das Abrufen eines Dokuments mithilfe der get-API vollständig in Echtzeit erfolgt.

+0

Danke, noch nie davon gehört 1s. Soweit ich die Warnung verstehe, ist die Verwendung der 'GET' API viel besser. Ich werde einen Weg finden, dies anstelle der Suche zu verwenden. –

+0

@ Léo Ist die get API langsamer als die Suche? –

+0

Nein, die get API ist mindestens so schnell wie die Suche (und wahrscheinlich schneller). Es erlaubt Ihnen jedoch nur, Dokumente nach ID abzurufen, und Sie können nicht wirklich suchen –

3

Wenn Sie Echtzeit-Zugriff auf Objekte, die Sie gerade indiziert Sie die get-API (http://www.elasticsearch.org/guide/reference/api/get/) und nicht die Suche verwenden müssen. Die Suche, wie hier angegeben, ist nicht in Echtzeit. Die get API ist. Wenn Sie also Ihrem Objekt selbst eine ID geben, können Sie dieses Objekt sofort mit der get API erhalten.

0

Es gibt auch an optimization, um den Suchindex refresh_interval während des schweren Imports (wie Bulk) zu deaktivieren und es nach Abschluss wieder einzusetzen. Dann warten/schlafen einige Sekunden und es sollte funktionieren. Sie können auch das Aktualisierungsintervall mit dieser Einstellung optimieren (vielleicht ist es Ihnen egal und möchten, dass es nur alle 15s aktualisiert wird)