Обновить только значение поля в elasticsearch

Возможно ли обновить некоторые значения определенных полей в elasticsearch без перезаписи других полей.?

Ответ 1

В качестве кодового вклада в этот ответ может быть использован следующий запрос:

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

Этот запрос обновляет свойство yourProperty только.

В результате появляется такой ответ:

{
   "_index": "index",
   "_type": "type",
   "_id": "100100471",
   "_version": 1,
   "_shards": {
      "total": 0,
      "successful": 1,
      "failed": 0
   }
}

Ответ 2

Да, Elasticsearch поддерживает частичные обновления. Это означает, что вы можете отправить:

  • частичный документ, который будет объединен с существующим
  • скрипт, который будет выполнен поверх существующего документа

Посмотрите на обновление API. В обоих случаях из-за того, как работает базовая библиотека lucene, происходит то, что обновляемый документ извлекается, к нему применяются изменения, и старый документ перезаписывается новым. В конце концов, это фактически полная перезапись документа, но вам не нужно отправлять весь документ, если вы не отключили поле _source, включенное по умолчанию, то есть поле, которое позволяет получить весь документ, чтобы применить к нему изменения.

Ответ 3

Если вы хотите обновить только существующее значение поля, попробуйте следующее решение:

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)
        ]
      }
  }
}

Если вы хотите добавить новое поле со значением, попробуйте следующее решение:

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)
        ]
      }
  }
}

Ответ 4

У меня та же проблема, кто-нибудь знает?

Ответ 5

В ES 7.3 новый формат:

POST /myindex/_update/mydocid
{
    "doc" : {
        "myfield": "new value of my field"
    }
}

Ответ 6

вы можете сделать следующее:

  • получить документ
  • обновите свое поле
  • напишите документ назад

это то же самое для Solr

если вы просто пишете новый документ (с существующим идентификатором) и заполняете только одно поле, которое хотите обновить, весь документ (все остальные поля) будет перезаписан