刚刚POST后,Elasticsearch GET

时间:2013-08-06 11:09:29

标签: elasticsearch pyes

我在向ES发出多个get_or_create请求时遇到了一些问题。 Elasticsearch似乎需要一段时间才能回复POST来为文档编制索引,以至于GET在之后调用后不会返回任何结果。

此示例重现了该问题:

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进展顺利:

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

第一个GET与任何结果都不匹配:

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

短暂暂停后,显示结果(第二个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"
            }
        }]
    }
}

这种行为是否正常?

即使响应较慢,是否有可能立即获得结果?

谢谢!

3 个答案:

答案 0 :(得分:8)

是的,这是正常的,弹性搜索默认每秒更新一次索引。

如果您需要立即更新,请在插入文档时在URL中包含refresh = true

来自文档:

  

<强>刷新

     

要在操作发生后立即刷新索引,以便文档立即显示在搜索结果中,刷新参数可以设置为true。将此选项设置为true只应在仔细考虑并验证它不会导致性能不佳的情况下完成,无论是从索引还是从搜索的角度来看。请注意,使用get API获取文档完全是实时的。

答案 1 :(得分:3)

如果您需要实时访问刚编入索引的对象,则需要使用get API(http://www.elasticsearch.org/guide/reference/api/get/)而不是搜索。如此处所述,搜索不是实时的。 get API是。因此,如果您自己为对象提供ID,则可以使用get API立即通过ID获取该对象。

答案 2 :(得分:0)

还有an optimization在重度导入过程中关闭搜索索引refresh_interval(如批量)并在完成后将其重新放回。 然后等待/睡几秒钟它应该工作。 您也可以使用此调整刷新间隔(可能您不关心并希望它每15秒刷新一次)