web-dev-qa-db-ja.com

elasticsearchの特定のフィールド値のみを更新します

Elasticsearchの特定のフィールドの値を、他のフィールドを上書きせずに更新することは可能ですか? ?

20
Johnsa Philip

この回答に対するコードベースの貢献として、次のクエリを使用できます。

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

このクエリはyourPropertyプロパティのみを更新します。

その結果、次の応答が表示されます。

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

はい、Elasticsearchは部分的な更新をサポートしています。それはあなたが提出できることを意味します:

  • 既存のドキュメントとマージされる部分的なドキュメント
  • 既存のドキュメントの上で実行されるスクリプト

pdate api をご覧ください。どちらの場合も、基盤となるluceneライブラリの動作により内部で発生することは、更新されるドキュメントが取得され、変更が適用され、古いドキュメントが新しいドキュメントで上書きされることです。結局のところ、それは実際にはドキュメントの完全な書き直しですが、デフォルトで有効になっている _ source field を無効にしない限り、ドキュメント全体を送信する必要はありません。変更を適用するためにドキュメント全体を取得できるフィールド。

20
javanna

既存のフィールド値のみを更新する場合は、次の解決策を試す必要があります。

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)
        ]
      }
  }
}
0
Sumit Sood

ES 7.3の新しい形式は次のとおりです。

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