Elasticsearch(ES)的滾動搜索與批量操作

1. 概述

 今天我們來聊一下Elasticsearch(ES)的滾動搜索與批量操作。

 

2. Elasticsearch(ES)的滾動搜索

2.1 概述 

滾動搜索我們經常能夠用到,例如:推薦列表,此類列表通常不需要分頁,而是一直上滑刷新。

滾動搜索的原理是根據固定的排序規則先載入一部分數據,當用戶再刷新時,從上次載入的最後一條數據的位置再載入同樣數量的數據,下一次刷新同理。

 

2.2 第一次搜索請求

第一次搜索的請求比較特殊,與之後的搜索請求的url和參數不同。

參數中的 scroll=1m,是指滾動搜索的下一次搜索,必須在1分鐘之內。

size是每次滾動顯示的條數。

 

POST  //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": "//www.zhuifengren.cn/img/xwe.jpg"
                },
                "sort": [
                    28
                ]
            }
        ]
    }
}

 

 2.3 之後的搜索

 

參數中 scroll_id 是第一次搜索返回的。

 

POST  //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": "//www.zhuifengren.cn/img/jsls.jpg"
                },
                "sort": [
                    25
                ]
            }
        ]
    }
}

 

 

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

3.1 批量依據ID查詢文檔

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

參數:

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

 

3.2 批量新增文檔1

注意:參數的最後一行,需要以回車(’\n’)結尾。

其中一條報錯,不會影響其他數據正常執行。

如果新增數據的id已存在會報錯。

POST  //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  //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  //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   //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  //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