diadia

興味があることをやってみる。自分のメモを残しておきます。

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以外が表示されるようだ。 f:id:torajirousan:20210711122216p:plain

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以上のデータを扱うときはエラーが出るらいい。その際は非同期のものを使えば、そのエラーは避けられる。