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

引數:

  1. {
  2. "query": {
  3. "match_all": {}
  4. },
  5. "sort": [
  6. {
  7. "age": "desc"
  8. }
  9. ],
  10. "size": 1
  11. }

響應:

  1. {
  2. "_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG0WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
  1. "took": 7,
  2. "timed_out": false,
  3. "_shards": {
  4. "total": 5,
  5. "successful": 5,
  6. "skipped": 0,
  7. "failed": 0
  8. },
  9. "hits": {
  10. "total": {
  11. "value": 3,
  12. "relation": "eq"
  13. },
  14. "max_score": null,
  15. "hits": [
  16. {
  17. "_index": "index_user",
  18. "_type": "_doc",
  19. "_id": "2",
  20. "_score": null,
  21. "_source": {
  22. "user_id": "2",
  23. "name": "夏維爾",
  24. "login_name": "xwe",
  25. "age": 28,
  26. "birthday": "1992-06-06",
  27. "desc": "我是一名高階開發經理,每天坐地鐵上班,在北京住,從不堵車",
  28. "head_url": "https://www.zhuifengren.cn/img/xwe.jpg"
  29. },
  30. "sort": [
  31. 28
  32. ]
  33. }
  34. ]
  35. }
  36. }

 2.3 之後的搜尋

引數中 scroll_id 是第一次搜尋返回的。

POST  http://192.168.1.8:9200/_search/scroll

引數:

  1. {
  2. "scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG0WejhoNTc2clNScU9NWlpHQ3A4VXJGURZhVFFQSDRqeVJQZXlNZ2U1VXFyaHZBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
  3. "scroll":"1m"
  4. }

響應:

  1. {
  2. "_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBRYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAG8WejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHEWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHIWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAHAWejhoNTc2clNScU9NWlpHQ3A4VXJGURYxMDBJOHhrUFJwdUdkUHJpbE52VjlBAAAAAAAAAG4WejhoNTc2clNScU9NWlpHQ3A4VXJGUQ==",
  3. "took": 12,
  4. "timed_out": false,
  5. "_shards": {
  6. "total": 5,
  7. "successful": 5,
  8. "skipped": 0,
  9. "failed": 0
  10. },
  11. "hits": {
  12. "total": {
  13. "value": 6,
  14. "relation": "eq"
  15. },
  16. "max_score": null,
  17. "hits": [
  18. {
  19. "_index": "index_user",
  20. "_type": "_doc",
  21. "_id": "1",
  22. "_score": null,
  23. "_source": {
  24. "user_id": "1",
  25. "name": "殭屍獵手",
  26. "login_name": "jsls",
  27. "age": 25,
  28. "birthday": "1990-03-01",
  29. "desc": "我是一名房產經紀人,現在轉行了,目前是一名運輸工人",
  30. "head_url": "https://www.zhuifengren.cn/img/jsls.jpg"
  31. },
  32. "sort": [
  33. 25
  34. ]
  35. }
  36. ]
  37. }
  38. }

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

3.1 批量依據ID查詢文件

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

引數:

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

3.2 批量新增文件1

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

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

如果新增資料的id已存在會報錯。

POST  http://192.168.1.8:9200/_bulk

引數:

  1. {"create":{"_index":"index_user", "_type":"_doc", "_id": "5"}}
  2. {"user_id":"5", "name":"姓名5"}
  3. {"create":{"_index":"index_user", "_type":"_doc", "_id": "6"}}
  4. {"user_id":"6", "name":"姓名6"}
  5. {"create":{"_index":"index_user", "_type":"_doc", "_id": "7"}}
  6. {"user_id":"6", "name":"姓名7"}

3.3 批量新增文件2

批量新增文件的第二種寫法。

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

引數:

  1. {"create":{"_id": "5"}}
  2. {"user_id":"5", "name":"姓名5"}
  3. {"create":{"_id": "6"}}
  4. {"user_id":"6", "name":"姓名6"}
  5. {"create":{"_id": "7"}}
  6. {"user_id":"6", "name":"姓名7"}

3.4 批量新增或更新文件

當id不存在,會新增文件,id已存在,會更新文件。

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

引數:

  1. {"index":{"_id": "5"}}
  2. {"user_id":"5", "name":"姓名5_1"}
  3. {"index":{"_id": "6"}}
  4. {"user_id":"6", "name":"姓名6_1"}
  5. {"index":{"_id": "8"}}
  6. {"user_id":"8", "name":"姓名8_1"}

3.5 批量區域性更新文件

當id不存在,會報錯。

POST   http://192.168.1.8:9200/index_user/_doc/_bulk

引數:

  1. {"update":{"_id": "5"}}
  2. {"doc": {"user_id":"5", "name":"姓名5_2"}}
  3. {"update":{"_id": "6"}}
  4. {"doc": {"user_id":"6", "name":"姓名6_2"}}
  5. {"update":{"_id": "9"}}
  6. {"doc": {"user_id":"9", "name":"姓名9_1"}}

3.6 批量刪除文件

POST  http://192.168.1.8:9200/index_user/_doc/_bulk

引數:

  1. {"delete":{"_id": "5"}}
  2. {"delete":{"_id": "6"}}

3.7 其他說明

批量新增、更新、刪除的操作,可以在一次請求完成。

每次批量新增、更新、刪除的請求,請求體不宜過大,控制在1000條之內。

4. 綜述

今天簡單聊了一下 Elasticsearch(ES)的滾動搜尋與批量操作,希望可以對大家的工作有所幫助。

歡迎幫忙點贊、評論、加關注 :)

關注追風人聊Java,每天更新Java乾貨。

  1. scroll_id