Elasticsearch(ES)的滾動搜索與批量操作
- 2021 年 9 月 22 日
- 筆記
- 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