2013-08-06 76 views
9

對ES執行幾個get_or_create請求時遇到一些問題。 Elasticsearch在回覆POST以索引文檔之後似乎需要一段時間,因此在之後的GET被稱爲返回沒有結果。Elasticsearch在POST後立即登錄

這個例子重現問題:

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

POST得好:

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

又過了:

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

第一GET沒有任何結果匹配短暫的停頓,顯示結果(第二個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" 
      } 
     }] 
    } 
} 

這種行爲是否正常?

即使響應較慢,是否可以立即得到結果?

謝謝!

+0

您的索引請求會導致創建一個新的索引?如果我理解正確,你不會使用create index api預先創建它。 – javanna

+0

是的,但該示例基於Elasticsearch的文檔。事實是,我的環境中發生了以前創建的索引。 下面兩個人做出了很好的答案:使用GET API對於這種情況會更安全。 –

+0

當然,我沒有注意到,大寫的http GET方法困惑了我:)如答案所述,使用get或者顯式調用refresh。乾杯! – javanna

回答

7

是的,這是正常的,默認情況下,彈性搜索更新索引每秒一次。

如果你需要立即更新包括刷新=在URL真正插入文檔

從文檔時:

刷新

要在手術後立即刷新指數發生,以便文檔立即出現在搜索結果中,刷新參數可以設置爲true。只有經過認真思考和驗證,才能將此選項設置爲true,以免從索引和搜索角度出現性能不佳的情況。請注意,使用get API獲取文檔是完全實時的。

+0

謝謝,從未聽說過這個1s。 據我瞭解的警告,使用'GET' API更好。 我會找到一種方法來使用它而不是搜索。 –

+0

@Léoget API比搜索速度慢嗎? –

+0

沒有get API至少與搜索一樣快(可能更快)。但是它只允許你通過id獲取文檔,並且它不允許你實際搜索 –

3

如果您需要實時訪問剛索引的對象,則需要使用get API(http://www.elasticsearch.org/guide/reference/api/get/)而不是搜索。如此處所述,搜索不是實時的。 get API是。所以如果你自己給你的對象一個ID,你可以通過get API立即獲得該對象的ID。

0

還有an optimization在繁重導入(如批量)期間關閉搜索索引refresh_interval,並在完成後將其放回。 然後等待/睡眠幾秒鐘,它應該工作。 您也可以使用此調整刷新間隔(也許你不關心,並希望它只刷新每15秒)

相關問題