1. 概述

今天我们来聊一下Elasticsearch(ES)的滚动搜索与批量操作。

2. Elasticsearch(ES)的滚动搜索

2.1 概述 

滚动搜索我们经常能够用到,例如:推荐列表,此类列表通常不需要分页,而是一直上滑刷新。

滚动搜索的原理是根据固定的排序规则先加载一部分数据,当用户再刷新时,从上次加载的最后一条数据的位置再加载同样数量的数据,下一次刷新同理。

2.2 第一次搜索请求

第一次搜索的请求比较特殊,与之后的搜索请求的url和参数不同。

参数中的 scroll=1m,是指滚动搜索的下一次搜索,必须在1分钟之内。

size是每次滚动显示的条数。

POST  http://192.168.1.8:9200/index_user/_search?scroll=1m

参数:

{
"query": {
"match_all": {}
},
"sort": [
{
"age": "desc"
}
],
"size": 1
}

响应:

{
"_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG0WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
"took": 7,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "index_user",
"_type": "_doc",
"_id": "2",
"_score": null,
"_source": {
"user_id": "2",
"name": "夏维尔",
"login_name": "xwe",
"age": 28,
"birthday": "1992-06-06",
"desc": "我是一名高级开发经理,每天坐地铁上班,在北京住,从不堵车",
"head_url": "https://www.zhuifengren.cn/img/xwe.jpg"
},
"sort": [
28
]
}
]
}
}

 2.3 之后的搜索

参数中 scroll_id 是第一次搜索返回的。

POST  http://192.168.1.8:9200/_search/scroll

参数:

{
"scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG0WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
"scroll":"1m"
}

响应:

{
"_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHIWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
"took": 12,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "index_user",
"_type": "_doc",
"_id": "1",
"_score": null,
"_source": {
"user_id": "1",
"name": "僵尸猎手",
"login_name": "jsls",
"age": 25,
"birthday": "1990-03-01",
"desc": "我是一名房产经纪人,现在转行了,目前是一名运输工人",
"head_url": "https://www.zhuifengren.cn/img/jsls.jpg"
},
"sort": [
25
]
}
]
}
}

3. Elasticsearch(ES)的文档批量操作

3.1 批量依据ID查询文档

POST  http://192.168.1.8:9200/index_user/_doc/_mget

参数:

{
"ids":["1", "3"]
}

3.2 批量新增文档1

注意:参数的最后一行,需要以回车('\n')结尾。

其中一条报错,不会影响其他数据正常执行。

如果新增数据的id已存在会报错。

POST  http://192.168.1.8:9200/_bulk

参数:

{"create":{"_index":"index_user", "_type":"_doc", "_id": "5"}}
{"user_id":"5", "name":"姓名5"}
{"create":{"_index":"index_user", "_type":"_doc", "_id": "6"}}
{"user_id":"6", "name":"姓名6"}
{"create":{"_index":"index_user", "_type":"_doc", "_id": "7"}}
{"user_id":"6", "name":"姓名7"}

3.3 批量新增文档2

批量新增文档的第二种写法。

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

参数:

{"create":{"_id": "5"}}
{"user_id":"5", "name":"姓名5"}
{"create":{"_id": "6"}}
{"user_id":"6", "name":"姓名6"}
{"create":{"_id": "7"}}
{"user_id":"6", "name":"姓名7"}

3.4 批量新增或更新文档

当id不存在,会新增文档,id已存在,会更新文档。

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

参数:

{"index":{"_id": "5"}}
{"user_id":"5", "name":"姓名5_1"}
{"index":{"_id": "6"}}
{"user_id":"6", "name":"姓名6_1"}
{"index":{"_id": "8"}}
{"user_id":"8", "name":"姓名8_1"}

3.5 批量局部更新文档

当id不存在,会报错。

POST   http://192.168.1.8:9200/index_user/_doc/_bulk

参数:

{"update":{"_id": "5"}}
{"doc": {"user_id":"5", "name":"姓名5_2"}}
{"update":{"_id": "6"}}
{"doc": {"user_id":"6", "name":"姓名6_2"}}
{"update":{"_id": "9"}}
{"doc": {"user_id":"9", "name":"姓名9_1"}}

3.6 批量删除文档

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

参数:

{"delete":{"_id": "5"}}
{"delete":{"_id": "6"}}

3.7 其他说明

批量新增、更新、删除的操作,可以在一次请求完成。

每次批量新增、更新、删除的请求,请求体不宜过大,控制在1000条之内。

4. 综述

今天简单聊了一下 Elasticsearch(ES)的滚动搜索与批量操作,希望可以对大家的工作有所帮助。

欢迎帮忙点赞、评论、加关注 :)

关注追风人聊Java,每天更新Java干货。

scroll_id

Elasticsearch(ES)的滚动搜索与批量操作的更多相关文章

  1. Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据

    相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...

  2. ElasticSearch核心知识总结(一)es的六种搜索方式和数据分析

    es的六种搜索方式 query string search GET /ecommerce/product/_search //查询所有数据 { "took": 4,//耗费几毫秒 ...

  3. ElasticSearch(二十四)基于scoll技术滚动搜索大量数据

    1.为什么要使用scroll? 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scoll滚动查询,一批一批的查,直到所有数据都查询完处理完 2.原理 使用scoll滚动搜索,可以 ...

  4. 用ElasticSearch搭建自己的搜索和分析引擎

    作者:robben,腾讯高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 导语:互联网产品中的检索功能随处可见.当你的项目规模是百度大搜|商搜或者微信公众号搜索这种体量的时候 ...

  5. 用ElasticSearch搭建自己的搜索和分析引擎【转自腾讯Wetest】

    本文大概地介绍了ES的原理,以及Wetest在使用ES中的一些经验总结.因为ES本身涉及的功能和知识点非常广泛,所以这里重点挑出了实际项目中可能会用到,也可能会踩坑的一些关键点进行了阐述. 一 重要概 ...

  6. elasticsearch 深入 —— Scroll滚动查询

    Scroll search 请求返回一个单一的结果"页",而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor. 滚动并 ...

  7. Elasticsearch(es)介绍与安装

    ### RabbitMQ从入门到集群架构: https://zhuanlan.zhihu.com/p/375157411 可靠性高 ### Kafka从入门到精通: https://zhuanlan. ...

  8. 转:在ElasticSearch之下(图解搜索的故事)

    ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...

  9. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

随机推荐

  1. Create Shortcut to Get Jar File Meta Information

    You have to get meta information of cobertura.jar with command "unzip -q -c cobertura.jar META- ...

  2. KNeighborsClassifier()的参数无效错误

    KNeighborsClassifier()的参数无效错误 写在前面:如果对自己英语拼写很自信,可以不用往下看了,我就是拼写错误 错误提示 Invalid parameter n_neightbors ...

  3. linux联网、远程

    使用VMware虚拟机创建linux系统CentOS 7,连接网络以及远程Moba工具. 一.首先安装好VMware虚拟机和CentOS系统,网上很多教程,不在赘述. 二.打开VMware进行配置 1 ...

  4. hdmi 随笔

    从图片来看,每张图片开始传输的是45像素的垂直同步, 1.控制数据贯穿所有时间,没个不是控制数据的传输都被控制数据包围.控制数据还要通过控制位指示,下一个数据是数据岛还是视频信号. 2.terc4 全 ...

  5. 深入解析多态和方法调用在JVM中的实现

    深入解析多态和方法调用在JVM中的实现 1. 什么是多态 多态(polymorphism)是面向对象编程的三大特性之一,它建立在继承的基础之上.在<Java核心技术卷>中这样定义: 一个对 ...

  6. 浅谈模拟彩票代码,html,javascript

    今天简单介绍一下用html,javascript来模拟双色球彩票选择器. 双色球彩票规则:由6个红球和1个蓝球组成,其中6个红球是从1-33中随机选出的不重复的6个数,从小到大一次排列:蓝球是1-16 ...

  7. 基于taro封装底下浮动弹窗组件

    先看效果图: jsx: import Taro, { Component } from '@tarojs/taro' import { View, Image } from '@tarojs/comp ...

  8. 【springcloud】springcloud与springboot的版本对应关系

    官方网址:https://start.spring.io/actuator/info 更新时间:2019-12-01 spring-cloud: "Finchley.M2": &q ...

  9. Verilog实例数组

    编写 Verilog 代码多年,至今才无意中发现了一种奇怪的语法,估计见过的这种的写法的人,在 FPGA 开发者中不会超过 20% 吧. 直接来看代码吧.先定义了一个简单的模块,名为 mod. mod ...

  10. vue3.0入门(四):组件

    组件 组件基础 <my-counter></my-counter> const app = Vue.createApp({ // 根组件 data() { return {} ...