使用 OpenSearch Python bulk api 将数据插入多个索引

本文档展示了如何在 curl 中使用 POST 请求插入具有多个索引的批量数据: https://opensearch.org/docs/latest/opensearch/index-data/

如果我有这种格式的数据,

[
{ "index": { "_index": "index-2022-06-08", "_id": "<id>" } }
{ "A JSON": "document" }
{ "index": { "_index": "index-2022-06-09", "_id": "<id>" } }
{ "A JSON": "document" }
{ "index": { "_index": "index-2022-06-10", "_id": "<id>" } }
{ "A JSON": "document" }
]

批量请求应该从 "_index": "index-2022-06-08" 获取索引名称

我试图使用 OpenSearch-py 库来做同样的事情,但我找不到任何示例片段可以做到这一点。我正在使用这种格式从 AWS Lambda 发送请求。

client = OpenSearch(
            hosts = [{'host': host, 'port': 443}],
            http_auth = awsauth,
            use_ssl = True,
            verify_certs = True,
            connection_class = RequestsHttpConnection
            )

        resp = helpers.bulk(client, logs, index= index_name, max_retries = 3)

在这里,我不得不提到 index_name 作为批量请求中的参数,因此它不会从数据本身中获取 index_name。如果我没有在参数中提及 index_name,我会收到错误 4xx index_name missing。

我也在研究批量 api 源代码: https://github.com/opensearch-project/opensearch-py/blob/main/opensearchpy/helpers/actions.py#L373

看起来 index_name 不是强制性参数。

谁能帮我解决我想念的问题?

stack overflow Using OpenSearch Python bulk api to insert data to multiple indices
原文答案

答案:

作者头像

我遇到了同样的问题,并在 elasticsearch.py bulk-helpers documentation 中找到了解决方案。当搜索端点返回的 _source-structure 中提供了文档时,它就可以工作。

调用批量方法:

resp = helpers.bulk(
    self.opensearch,
    actions,
    max_retries=3,
)

其中 actions 是这样的字典列表:

[{
    '_op_type': 'update',
    '_index': 'index-name',
    '_id': 42,
    '_source': {
        "title": "Hello World!",
        "body": "..."
    }
}]

_op_type 可用作附加字段来定义应为文档调用的操作( indexupdatedelete 、...)。

希望这可以帮助遇到相同问题的任何人!