我在向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"
}
}]
}
}
这种行为是否正常?
即使响应较慢,是否有可能立即获得结果?
谢谢!
答案 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秒刷新一次)