Update only specific field value in elasticsearch

后端 未结 6 945
轻奢々
轻奢々 2020-12-28 12:22

Is it possible to update some specific fields value in elasticsearch with out overwriting other fields. ?

相关标签:
6条回答
  • 2020-12-28 12:31

    Try this

    curl -XPOST --header 'Content-Type: application/json' https://search-testarticle-2cwv6oh7wtz3hxowgxv3rprnsa.ap-south-1.es.amazonaws.com/test/_update/4gI4knQB7d5sAgV24YPy -d '{
    "doc":  { "name" : "Ankit Singh Raj" }
    }'
    
    0 讨论(0)
  • 2020-12-28 12:35

    Yes, Elasticsearch supports partial updates. That means that you can submit:

    • a partial document, which will be merged with the existing one
    • a script that will be executed on top of the existing document

    Have a look at the update api. In both cases, what happens under the hood, due to how the underlying lucene library works, is that the document to be updated is retrieved, the changes are applied to it, and the old document gets overwritten with the new. At the end of the day it is in fact a complete rewrite of the document, but you don't have to submit the whole document, unless you disabled the _source field, enabled by default, which is the field that allows you to retrieve to whole document in order to apply changes to it.

    0 讨论(0)
  • 2020-12-28 12:40

    In ES 7.3 the new format is:

    POST /myindex/_update/mydocid
    {
        "doc" : {
            "myfield": "new value of my field"
        }
    }
    
    0 讨论(0)
  • 2020-12-28 12:47

    As a codebased contribution to this answer, the following query may be used:

    POST /index/type/100100471/_update
    {
        "doc" : {
            "yourProperty" : 10000
        }
    }
    

    This query updates yourProperty property only.

    As a result, this response appears:

    {
       "_index": "index",
       "_type": "type",
       "_id": "100100471",
       "_version": 1,
       "_shards": {
          "total": 0,
          "successful": 1,
          "failed": 0
       }
    }
    
    0 讨论(0)
  • 2020-12-28 12:47

    Also you can use bulk Update to partially update multiple doc

    POST /foo_v1/_bulk?pretty=true&error_trace=true
    {"update":{"_index":"foo_v1","_type":"footype","_id":"397"}}
    {"doc":{"Name":"foo","EmailId":"foo@test.com"}}
    {"update":{"_index":"foo_v1","_type":"footype","_id":"398"}}
    {"doc":{"Name":"foo1","EmailId":"foo1@test.com"}}
    

    If you are not sure whether it will be a update or insert like Upsert so you can do :

    POST /foo_v1/_bulk?pretty=true&error_trace=true
    {"update":{"_index":"foo_v1","_type":"footype","_id":"397"}}
    {"doc":{"Name":"foo","EmailId":"foo@test.com"}, "doc_as_upsert" : true}
    

    use "doc_as_upsert" : true

    0 讨论(0)
  • 2020-12-28 12:52

    If you would like to update the existing field value only then you must try this solution:

    POST IndexName/_update_by_query
    {
      "script": {
        "source": """
    
       if (ctx._source?.Field != null) 
        {  
            ctx._source.remove('Field');
            ctx._source.put('Field', 'Value');
        }   
        """,
        "lang": "painless"
      },
      "query": {
        "terms": {
            "_id": [
              1 (Replace with Document ID)
            ]
          }
      }
    }
    

    If you would like to add new field with value then you must try this solution:

    POST IndexName/_update_by_query
    {
      "script": {
        "source": """
    
       if (ctx._source?.NewField == null) 
        {  
            ctx._source.hf.put('NewField', 'Value');
        }   
        """,
        "lang": "painless"
      },
      "query": {
        "terms": {
            "_id": [
              1 (Replace with Document ID)
            ]
          }
      }
    }
    
    0 讨论(0)
提交回复
热议问题