我在Python中找不到从Elasticsearch
删除文档的任何示例。我现在看到的是delete
和delete_by_query
函数的定义。但由于某些原因,documentation甚至没有提供使用这些功能的微观示例。单个参数列表并没有告诉我太多,如果我不知道如何正确地将它们提供给函数调用。所以,让我们说,我刚刚插入了一个新的doc:
doc = {'name':'Jacobian'}
db.index(index="reestr",doc_type="some_type",body=doc)
世界上谁知道我现在如何使用delete
和delete_by_query
删除此文档?
答案 0 :(得分:28)
由于在索引文档时没有给出文档ID,因此必须从返回值中获取自动生成的文档ID,并根据id删除。或者您可以自己定义ID,请尝试以下操作:
db.index(index="reestr",doc_type="some_type",id=1919, body=doc)
db.delete(index="reestr",doc_type="some_type",id=1919)
在另一种情况下,您需要查看返回值;
r = db.index(index="reestr",doc_type="some_type", body=doc)
# r = {u'_type': u'some_type', u'_id': u'AU36zuFq-fzpr_HkJSkT', u'created': True, u'_version': 1, u'_index': u'reestr'}
db.delete(index="reestr",doc_type="some_type",id=r['_id'])
delete_by_query的另一个例子。在添加多个名称为' Jacobian'的文档之后,请执行以下操作,删除名称为' Jacobian'
的所有文档。 db.delete_by_query(index='reestr',doc_type='some_type', q={'name': 'Jacobian'})
答案 1 :(得分:8)
出于多种原因,已从版本2中的ES核心中删除了“按查询删除”API。这个功能成为了一个插件。您可以在此处查找更多详细信息:
Why Delete-By-Query is a plugin
因为我不想添加另一个依赖项(因为我后来需要在docker镜像中运行),我编写了一个自己的函数来解决这个问题。我的解决方案是搜索具有指定索引和类型的所有引号。之后,我使用批量API删除它们:
def delete_es_type(es, index, type_):
try:
count = es.count(index, type_)['count']
response = es.search(
index=index,
filter_path=["hits.hits._id"],
body={"size": count, "query": {"filtered" : {"filter" : {
"type" : {"value": type_ }}}}})
ids = [x["_id"] for x in response["hits"]["hits"]]
if len(ids) > 0:
return
bulk_body = [
'{{"delete": {{"_index": "{}", "_type": "{}", "_id": "{}"}}}}'
.format(index, type_, x) for x in ids]
es.bulk('\n'.join(bulk_body))
# es.indices.flush_synced([index])
except elasticsearch.exceptions.TransportError as ex:
print("Elasticsearch error: " + ex.error)
raise ex
我希望有助于未来的googlers;)
答案 2 :(得分:1)
一个人也可以做这样的事情:
def delete_by_ids(index, ids):
query = {"query": {"terms": {"_id": ids}}}
res = es.delete_by_query(index=index, body=query)
pprint(res)
# Pass index and list of id that you want to delete.
delete_by_ids('my_index', ['test1', 'test2', 'test3'])
将对批量数据执行删除操作