1. 程式人生 > >ElasticSearch 條件更新 刪除

ElasticSearch 條件更新 刪除

ElasticSearch根據匹配某個條件,區域性更新文件

首先宣告版本為ES 6.0。

index中有很多文件,要更新這些文件中符合某個條件的所有documents,可以使用ES的_update_by_query的及指令碼方式完成:POST請求:http://localhost:9200/indexName/typeName/_update_by_query

  1. {

  2. "script": {"source":"ctx._source['user_name']='LsiuLi';ctx._source['assignedto_id']='123';"},

  3. "query": {"term": {"user_id": 60}}

  4. }

執行上面的query,意思是把當前index/type下的所有符合user_id為 60的document,把這些document的user_name欄位全部修改成LsiuLi,把assignedto_id 改成123。

如果增加陣列元素:

http://localhost:9200/1909_user/user/15670260/_update

  1. {

  2. "script": {

  3. "lang": "painless",

  4. "source":"ctx._source['field_mult_value_7917'].add(params.hobby)",

  5. "params" : {

  6. "hobby" : "c"

  7. }

  8. }

  9. }

script 刪除index中的field:

http://localhost:9200/1542_case/case/_update_by_query?wait_for_completion=false&conflicts=proceed

  1. {

  2. "script": {"source":"ctx._source.remove('user_field_email_5613')"}

  3. }

wait_for_completion=false可以直接返回http請求,哪怕index中的field還沒刪完。


參考連結:

https://www.elastic.co/guide/en/elasticsearch/reference/6.0/modules-scripting-using.html

https://www.cnblogs.com/rodge-run/p/7760308.html

elasticsearch 資料 新增,更新,刪除,查詢

上篇文章說了,elasticsearch mapping欄位的增,刪,更新。如果把mapping的修改理解成對資料結構的修改,那這篇文章就可以理解成對資料的修改。

1,新增資料

  1. $ curl -XPOST "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  -H "Content-Type: application/json" -d ' 
  2.     "id" : 3, 
  3.     "username" :  "測試測試", 
  4.     "description" :  "測試測試" 
  5. }'  

2,更新資料

2.1,部分資料更新

  1. $ curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
  2.     "doc" : { 
  3.             "username" : "testtest" 
  4.         } 
  5.     } 
  6. }'  
  7. $ curl -XGET "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  
  8. {  
  9.   "_index" : "ik_v2",  
  10.   "_type" : "chinese",  
  11.   "_id" : "3",  
  12.   "_version" : 1,  
  13.   "found" : true,  
  14.   "_source" : {  
  15.     "id" : 3,  
  16.     "username" : "testtest",  //部分更新了  
  17.     "description" : "測試測試"  
  18.   }  
  19. }  

2.2,全部更新

  1. curl -XPOST "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  -H "Content-Type: application/json" -d ' 
  2.     "id" : 4, 
  3.     "username" :  "111111111", 
  4.     "description" :  "222222222" 
  5. }'  
  6. //id為3的資料全部更新了  
  7. $ curl -XGET "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  
  8. {  
  9.   "_index" : "ik_v2",  
  10.   "_type" : "chinese",  
  11.   "_id" : "3",  
  12.   "_version" : 1,  
  13.   "found" : true,  
  14.   "_source" : {  
  15.     "id" : 4,  
  16.     "username" : "111111111",  
  17.     "description" : "222222222"  
  18.   }  
  19. }  

2.3,拼接更新

  1. $ curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
  2.     "script" : { 
  3.         "inline" : "ctx._source.description += params.content", //因為description是string型,所以是拼 
  4.         "params" : { 
  5.             "content" : 333 
  6.         } 
  7.     } 
  8. }'  
  9. $ curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
  10.     "script" : { 
  11.         "inline" : "ctx._source.id += params.num",   //因為id是int型,所以是加 
  12.         "params" : { 
  13.             "num" : 2 
  14.         } 
  15.     } 
  16. }'  
  17. $ curl -XGET "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  
  18. {  
  19.   "_index" : "ik_v2",  
  20.   "_type" : "chinese",  
  21.   "_id" : "3",  
  22.   "_version" : 3,  
  23.   "found" : true,  
  24.   "_source" : {  
  25.     "id" : 6,   //加了2  
  26.     "username" : "111111111",  
  27.     "description" : "222222222333"   //拼了333  
  28.   }  
  29. }  

2.4,新增欄位,並更新資料

  1. //新增一個欄位為sex值為1  
  2. $ curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
  3.  "script" : "ctx._source.sex = 1" 
  4. }'  
  5. //刪除sex這個欄位  
  6. $ curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
  7.  "script" : "ctx._source.remove(\"sex\")" 
  8. }'  

在這裡要注意,用這個方法,mapping結構會改變。

注:以上的更新操作都是單條資料更新

2.5,多條資料更新

  1. $ curl -XPOST 'localhost:9200/ik_v2/test/_update_by_query?pretty' -H "Content-Type: application/json" -d '{ 
  2. >  "query": { 
  3. >         "bool": { 
  4. >             "should": { 
  5. >                 "match": { 
  6. >                     "username": "高鐵" 
  7. >                 } 
  8. >             } 
  9. >         } 
  10. >     }, 
  11. >     "script" : { 
  12. >         "inline" : "ctx._source.username = \"666666\"" 
  13. >     } 
  14. > }'  
  15. {  
  16.   "took" : 6,  
  17.   "timed_out" : false,  
  18.   "total" : 3,  
  19.   "updated" : 2,  //更新了二條  
  20.   "deleted" : 0,  
  21.   "batches" : 1,  
  22.   "version_conflicts" : 0,  
  23.   "noops" : 0,  
  24.   "retries" : {  
  25.     "bulk" : 0,  
  26.     "search" : 0  
  27.   },  
  28.   "throttled_millis" : 0,  
  29.   "requests_per_second" : -1.0,  
  30.   "throttled_until_millis" : 0,  
  31.   "failures" : [ ]  
  32. }  

注意,這個條件欄位,最好不要用分詞欄位,因為不可控。上面我只是為了測試用。

3,刪除資料

3.1,單條刪除

  1. $ curl -XDELETE "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  

3.2,多條資料刪除

  1. $ curl -XPOST 'http://127.0.0.1:9200/ik_v2/_delete_by_query?pretty' -H "Content-Type: application/json" -d '{ 
  2. > "query": { 
  3. >         "term": { 
  4. >             "username": "666666" 
  5. >         } 
  6. >     } 
  7. > }'  
  8. {  
  9.   "took" : 6,  
  10.   "timed_out" : false,  
  11.   "total" : 3,  
  12.   "deleted" : 2,  //刪除了二條  
  13.   "batches" : 1,  
  14.   "version_conflicts" : 0,  
  15.   "noops" : 0,  
  16.   "retries" : {  
  17.     "bulk" : 0,  
  18.     "search" : 0  
  19.   },  
  20.   "throttled_millis" : 0,  
  21.   "requests_per_second" : -1.0,  
  22.   "throttled_until_millis" : 0,  
  23.   "failures" : [ ]  
  24. }  

注意,這個條件欄位,最好不要用分詞欄位,因為不可控。

4,查詢

  1. $ curl -XPOST "http://127.0.0.1:9200/ik,ik_v2/chinese/_search?pretty"  -H "Content-Type: application/json"  -d ' 
  2.     "query": { 
  3.         "multi_match": { 
  4.             "query": "中國高鐵", 
  5.             "fields": [ "username", "description"] 
  6.         } 
  7.     } 
  8. '  

查詢的操作,非常多,後面會單獨的詳細說。查詢總的來說,支援多索引多欄位查詢。新版es不支援一個索引多個mapping,老版還支援多mapping查詢。