elasticsearchクエリメモ
バルクアップデート
ドキュメント:
バッチ処理 | Elasticsearchリファレンス [5.3] | Elastic
Bulk API | Elasticsearch Guide [7.13] | Elastic
クエリサンプル
PUT animal/_doc/_bulk?pretty {"update":{"_id":1}} {"doc":{"content":"最初のバルクアップデートの内容4"}} {"update":{"_id":2}} {"doc":{"content":"2番目のバルクアップデートの内容4"}} {"update":{"_id":3}} {"doc":{"content":"3番目のバルクアップデートの内容4"}} # 以下のようにdoc_typeをエンドポイントから排除するのが望ましいようだ PUT animal/_bulk?pretty {"update":{"_id":1}} {"doc":{"content":"最初のバルクアップデートの内容4"}} {"update":{"_id":2}} {"doc":{"content":"2番目のバルクアップデートの内容4"}} {"update":{"_id":3}} {"doc":{"content":"3番目のバルクアップデートの内容4"}}
java - ElasticSearch: Specifying types in bulk requests is deprecated - Stack Overflow
エラーの場合のレスポンス
更新対象のドキュメントIDがないときは、エラーが出る。 エラーは総括のところでerrors:trueとエラーが存在したドキュメントではstatusに200以外が表示されるようだ。
pyhonを使ってバルクアップデート
資料: バルクでドキュメント作成する資料:
Python Elasticsearch 基本的な使い方まとめ - Qiita
バルクでアップデートする際の資料:
https://github.com/django-es/django-elasticsearch-dsl/issues/224#issuecomment-551095445 ("_source"ではなく"doc"を使おうっていう内容)
from elasticsearch import Elasticsearch from elasticsearch.helpers import bulk from elasticsearch_dsl import Document, Date, Integer, Keyword, Text, connections from elasticsearch_dsl import Search, Q es = connections.create_connection(hosts=['localhost']) data_list = [] data2 = {"_op_type": "update", "_id": 2, "_index": "animal", "doc": {"content": "new22222"}} data3 = {"_op_type": "update", "_id": 3, "_index": "animal", "doc": {"content": "new3333"}} data_list.append(data2) data_list.append(data3) bulk(es, data_list)
メモ:
- elasticsearch_dslでbulkを扱えるのか結局分からなかった。
- bulkの参考資料は普通のelasticsearchモジュールを使っているのが全てだった。
- バルクで100MB以上のデータを扱うときはエラーが出るらいい。その際は非同期のものを使えば、そのエラーは避けられる。