2013-08-06 53 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秒)

相关问题