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