美文网首页
Elasticsearch(ES)的滚动搜索与批量操作

Elasticsearch(ES)的滚动搜索与批量操作

作者: 追风人聊Java | 来源:发表于2021-12-21 14:37 被阅读0次

    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干货。

    相关文章

      网友评论

          本文标题:Elasticsearch(ES)的滚动搜索与批量操作

          本文链接:https://www.haomeiwen.com/subject/cdjxqrtx.html