如何使用 elasticsearch python 中的特定字段名称从多个索引中删除文档?
How to delete documents from multiple indices using particular field name in elasticsearch python?
这是示例文档。
{
"_index": "mqtt-index-2018.01.23",
"_type": "iot_data",
"_id": "AWEjA7LNRU4cTUO-Lyj4",
"_score": null,
"_source": {
"message": "{\"datastream_name\": \"roshni\", \"value\": 12,
\"context\": {\"latitude\": 0, \"elevation\": 0, \"longitude\": 0},
\"device_id\": 31}",
"@version": "1",
"@timestamp": "2018-01-23T12:34:59.687Z",
"host": "iot-elk",
"topic": "telemetry/f2a55827ef554475a41c3c96369957f0/roshni",
"datastream_name": "roshni",
"value": 12,
"context": {
"latitude": 0,
"elevation": 0,
"longitude": 0
},
"device_id": 31,
"tstamp": "2018-01-23T12:34:59.687Z"
},
"fields": {
"tstamp": [
1516710899687
],
"@timestamp": [
1516710899687
]
},
"sort": [
1516710899687
]
}
我想使用 device_id 字段删除文档。
如何使用 API 调用或使用 python 客户端删除它?我已经尝试使用文档 _id 和特定索引,但我想使用 device_id 字段或其他字段删除它。
没有示例代码的简答:
- 将 json 转换为字典(参见 Converting JSON String to Dictionary Not List)
- 如果您有许多这样的数据结构,如果它们符合您的搜索条件(例如
if data["parsed_message"]["device_id"] not in list_of_forbidden_ids):
),请构建它们的列表
在使用原始 API 方面,我相信 this is what you are looking for。
根据您使用的 python 库,在 python 中实际上更容易。我使用 elasticesearch-dsl-py
,您可以在其中构建查询对象。 You can call delete on these query objects.
关于跨越多个索引,ElasticSearch 是支持的,要么使用通配符*
,要么用逗号分隔索引。
使用以下 DELETE API 调用从 elasticsearch 中的多个索引中删除文档。
curl -XDELETE 'http://localhost:9200/mqtt-index-*/logs/_query' -d '{
"query" : {
"match" : {"device_id": 31}
}
}' -i
您还可以删除匹配多个字段的文档。
curl -XDELETE 'http://localhost:9200/mqtt-index-*/logs/_query' -d '{
"query" : {
"bool": {
"must":[
{"match" : {"device_id":31}},
{"match": {"datastream_name": "test"}}
]
}
}' -i
这是示例文档。
{
"_index": "mqtt-index-2018.01.23",
"_type": "iot_data",
"_id": "AWEjA7LNRU4cTUO-Lyj4",
"_score": null,
"_source": {
"message": "{\"datastream_name\": \"roshni\", \"value\": 12,
\"context\": {\"latitude\": 0, \"elevation\": 0, \"longitude\": 0},
\"device_id\": 31}",
"@version": "1",
"@timestamp": "2018-01-23T12:34:59.687Z",
"host": "iot-elk",
"topic": "telemetry/f2a55827ef554475a41c3c96369957f0/roshni",
"datastream_name": "roshni",
"value": 12,
"context": {
"latitude": 0,
"elevation": 0,
"longitude": 0
},
"device_id": 31,
"tstamp": "2018-01-23T12:34:59.687Z"
},
"fields": {
"tstamp": [
1516710899687
],
"@timestamp": [
1516710899687
]
},
"sort": [
1516710899687
]
}
我想使用 device_id 字段删除文档。 如何使用 API 调用或使用 python 客户端删除它?我已经尝试使用文档 _id 和特定索引,但我想使用 device_id 字段或其他字段删除它。
没有示例代码的简答:
- 将 json 转换为字典(参见 Converting JSON String to Dictionary Not List)
- 如果您有许多这样的数据结构,如果它们符合您的搜索条件(例如
if data["parsed_message"]["device_id"] not in list_of_forbidden_ids):
),请构建它们的列表
在使用原始 API 方面,我相信 this is what you are looking for。
根据您使用的 python 库,在 python 中实际上更容易。我使用 elasticesearch-dsl-py
,您可以在其中构建查询对象。 You can call delete on these query objects.
关于跨越多个索引,ElasticSearch 是支持的,要么使用通配符*
,要么用逗号分隔索引。
使用以下 DELETE API 调用从 elasticsearch 中的多个索引中删除文档。
curl -XDELETE 'http://localhost:9200/mqtt-index-*/logs/_query' -d '{
"query" : {
"match" : {"device_id": 31}
}
}' -i
您还可以删除匹配多个字段的文档。
curl -XDELETE 'http://localhost:9200/mqtt-index-*/logs/_query' -d '{
"query" : {
"bool": {
"must":[
{"match" : {"device_id":31}},
{"match": {"datastream_name": "test"}}
]
}
}' -i