这个问题的目的是询问社区如何在不删除该字段的任何其他内容的情况下部分更新字段。
StackOverflow 中有很多使用 python、curl 等来部分更新 ElasticSearch _source字段的示例。 elasticsearch python 库配备了一个elasticsearch.helpers
文件夹,其中包含函数 - parallel_bulk
、streaming_bulk
、bulk
,允许开发人员轻松更新文档。
如果用户在 pandas 数据框中有数据,则可以轻松地遍历行以创建生成器以在 elasticsearch 中更新/创建文档。Elasticsearch 文档是不可变的,因此,当发生更新时,elasticsearch 将传递的信息用于创建新文档,增加文档版本,同时更新需要更新的内容。如果文档有一个字段作为列表,如果更新请求有一个值,它将用该新值替换整个列表。(许多 SO QAs 涵盖了这一点)。我不想用新值替换该列表的值,而是将列表中的单个值更新为新值。
例如,在我的 _source 中,我有一个字段为 ['101 country drive', '35 park drive', '277 Thunderroad belway']。该字段具有三个值,但假设我们意识到此文档不正确,我们需要将“101 country drive”更新为“1001 country drive”。
我不想删除列表中的其他值,而是只想用新值更新索引值。
我是否需要编写一个无痛的脚本来执行此操作,或者是否有其他方法可以执行此操作?
示例:想要更新文档来自 ---
{'took': 176,
'timed_out': False,
'_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0},
'hits': {'total': {'value': 0, 'relation': 'eq'},
'max_score': None,
'hits': [{'_index': 'docobot', '_type': '_doc', '_id': '19010239',
'_source': {'name': 'josephine drwaler', 'address': ['101 country drive', '35 park drive', '277 thunderroad belway']
}}]}}
至
{'took': 176,
'timed_out': False,
'_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0},
'hits': {'total': {'value': 0, 'relation': 'eq'},
'max_score': None,
'hits': [{'_index': 'docobot', '_type': '_doc', '_id': '19010239',
'_source': {'name': 'josephine drwaler', 'address': ['1001 country drive', '35 park drive', '277 thunderroad belway']
}}]}}
请注意,仅针对第一个索引更新地址,但索引号不应成为更新 _source 中地址值的因素。
在弹性搜索中部分更新文档同时保持该字段中剩余值的完整性的最有效和最pythonic的方法是什么?