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