elasticsearch如何获得查询的全部结果

通常,在ES中使用查询时,默认返回的前10条结果,当我们一个查询有上万的结果时,我们如何获取全部数据??虽然我们可以通过size设置查询后返回的条数。


  ES的API中提供了scan和scroll,这个方法有点类型传统数据库中的游标。



方法1:直接使用es提供的scroll



第一步:向ES服务器发送如下GET请求。{}中的内容写在请求体中。其中,scroll=1m,设定scroll 在1min内保持打开状态
GET /old_index/_search?scroll=10m
{
    "query": { "match_all": {}},
    "size":  1000
}


调用这个请求后,ES服务会响应一个类似以下的json:
{"_scroll_id":"c2NhbjszOzM1MTpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzM1MDpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzIzNzpnV2JCMkQ1RVFBdV90d3ZJOEVhOTl3OzE7dG90YWxfaGl0czo2NjUyOw==","took":3,"timed_out":false,"_shards":{"total":3,"successful":3,"failed":0},"hits":{"total":6652,"max_score":0.0,"hits":[]}}
,其中,_scroll_id在接下来的使用中非常重要,_scroll_id相当于传统数据库中的游标对象。


第二步:向服务器发送如下GET请求。将返回的_scroll_id作为参数传给服务器。第二行的内容是写在请求体中。
GET /_search/scroll?scroll=1m 
c2NhbjszOzM1MTpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzM1MDpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzIzNzpnV2JCMkQ1RVFBdV90d3ZJOEVhOTl3OzE7dG90YWxfaGl0czo2NjUyOw==


调用这个请求后,ES服务会响应一个类似以下的json:
{"_scroll_id":"c2NhbjszOzM1MTpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzM1MDpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzIzNzpnV2JCMkQ1RVFBdV90d3ZJOEVhOTl3OzE7dG90YWxfaGl0czo2NjUyOw==","took":2,"timed_out":false,"_shards":{"total":3,"successful":3,"failed":0},"hits":{"total":101,"max_score":null,"hits":[{"_index":"old_index","_type":"3","_id":"AVCoH6dlYbq5kuCt6S7A","_score":1.0,"_source":{文档}},{"_index":"old_index","_type":"3","_id":"AVCoH6dlYbq5kuCt6S7A","_score":1.0,"_source":{文档}}]}}


细心的我们会发现,ES返回的_scroll_id和发送给服务器的的_scroll_id值相同。说明是同一个对象。
第三步:重复第二步,直到hits中的数据为空。此时,该查询的所有数据获取完毕
第四步:删除该_scroll_id。GET请求如下所示:
DELETE /_search/scroll
c2NhbjszOzM1MTpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzM1MDpvRkJrRHNWbFNiV2RPLVhlbWlYc1h3OzIzNzpnV2JCMkQ1RVFBdV90d3ZJOEVhOTl3OzE7dG90YWxfaGl0czo2NjUyOw==


注意:
The response to this scroll request includes the first batch of results. Although we specified a size of 1,000, we get back many more documents. When scanning, the size is applied to each shard, so you will get back a maximum of size * number_of_primary_shards documents in each batch.


方法2:使用python提供的helpers.scan方法


scan使用代码:
scanResp = helpers.scan(es, _body, scroll= "10m", index= _index, doc_type= _doc_type, timeout="10m")
   
for resp in scanResp:
   print resp




  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
 ElasticSearch是一个基于ApacheLucene构建的开源搜索服务器。它提供了一个可扩展的搜索解决方案,内置支持近实时搜索和多租户。   《ElasticSearch 可扩展的开源弹性搜索解决方案》将教你如何构建一个快速、灵活、可扩展的搜索解决方案,通过建立自定义集群进入ElasticSearch的世界。通过学习数据索引和分析,你将掌握ElasticSearch的强大功能,包括如何搜索数据、如何扩大搜索范围,以及如何进行集群管理。   从建立自己的ElasticSearch集群开始,然后进行搜索并扩展搜索参数,你就可以创建一个完全自定义的搜索解决方案。在此基础上,你将进一步地学习ElasticSearch查询API,以及如何使用强大的过滤和统计功能。在ElasticSearch旅程最后总结的一些章节,帮助读者控制和调整集群,学习分片分配、网关模式配置等知识。   《ElasticSearch 可扩展的开源弹性搜索解决方案》是为希望利用ElasticSearch创建一个快速、灵活的搜索解决方案的开发者而撰写的。如果你正试图学习ElasticSearch或者希望变得更加精通,本书也同样适合。开始学习本书时你不需要知道关于ElasticSearch的任何知识,但知道一些数据库和查询的基本知识是必需的。   你将从本书学到   配置和创建一个ElasticSearch索引   使用ElasticSearch查询DSL进行各种查询   在不损失性能的情况下高效和精确地使用过滤器   实现自动补全功能   高亮数据和地理信息搜索以得到更好的结果   理解ElasticSearch如何返回结果及如何验证这些结果   使用统计和相似功能从搜索中获得更多,并提升客户的搜索体验   使用ElasticSearchAPI和第三方监控方案监控集群状态与集群健康状况
ElasticSearch查询构建器 该chrome扩展程序提供了易于使用的界面来配置不同的权重并动态增强选定字段的搜索结果,这将通过提供获得所需搜索结果所需的索引设置和文档映射来减少学习曲线,并为您可以通过在ES中运行相同的查询来减少开发时间,并在“结果”面板中显示结果。 可以在运行时更改设置以微调搜索结果,并将所有设置保存在“收藏夹”中,以备后用。 连接到ElasticSearch Server:提及正在运行ES的主机和端口(10.240.0.251:9200),然后按connect按钮。 构建查询:连接到服务器后,它将在可用的“索引和文档”下拉列表中列出所有索引及其对应的文档。 选择要为其生成查询的文档。现在,在“配置”选项卡下,您可以看到所选文档的所有字段的列表。 “配置”选项卡“动态得分”下的“选项”:它用于从多个匹配记录中提升特定记录,该匹配记录除了具有搜索关键字之外,还具有在booster字段中定义的值。 以相同顺序搜索:优先考虑以相同顺序找到的单词,而不是以相同顺序反对在同一行中找到的单词。 特殊字符:这将允许搜索字母数字,camelCase和用特殊字符(如(_,-等)分隔的单词。 生成查询:基于选定的选项,它将动态生成所需的索引设置,文档映射并构建查询。 “配置”选项卡权重下的选项:如果在多个字段中找到相同的单词,则用于为该字段赋予优先级。 给定字段得分更高的记录将被赋予更高的优先级,并排在首位。 过滤器:用于过滤掉从查询中收到的结果。如果选择了任何过滤器和值,则只会显示满足过滤条件的记录。 可以通过按+/-按钮在不同的数字字段上添加/删除类似(必须,范围)的过滤器。在结果中显示:这允许配置要在结果中看到的字段。您可以选择结果数要与默认情况下要查看的字段一起显示,将显示前五个字段。 您可以根据需要选择任何字段。 查询结果将显示在表格中。 在字段中搜索:这使用户可以选择要为给定查询搜索的文档字段。 显示结果:此按钮将带有要搜索的单词以及要显示的结果的最大大小,并建立一个动态查询,该查询针对选择的文档索引触发,它将获取结果并显示在结果面板下。 支持语言:English

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值