【问题标题】:How to delete documents from Elasticsearch如何从 Elasticsearch 中删除文档
【发布时间】:2015-08-31 18:33:52
【问题描述】:

我在 Python 中找不到任何从 Elasticsearch 删除文档的示例。我现在看到的是deletedelete_by_query 函数的定义。但出于某种原因,documentation 甚至没有提供使用这些功能的微观示例。如果我不知道如何正确地将它们提供给函数调用,那么单个参数列表并不能告诉我太多。所以,可以说,我刚刚插入了一个新文档,如下所示:

doc = {'name':'Jacobian'}
db.index(index="reestr",doc_type="some_type",body=doc)

谁知道我现在如何使用deletedelete_by_query 删除此文档?

【问题讨论】:

    标签: python elasticsearch


    【解决方案1】:

    由于您在索引文档时没有提供文档 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 的另一个示例。假设在添加了几个 name='Jacobian' 的文档后,运行以下命令删除所有 name='Jacobian' 的文档:

     db.delete_by_query(index='reestr',doc_type='some_type', q={'name': 'Jacobian'})
    

    【讨论】:

    • 您能详细说明一下吗?特别是,我对事先不知道id(在您的示例中为id=1919)的情况感兴趣。我问这个是因为我需要批量删除。
    • 而且,正如我所问的,delete_by_query 的示例也将受到我和其他新手的极大赞赏。
    • 如何删除所有文档的两个小例子
    • 那么你需要看看 .index() 方法的返回值。我已更新答案以涵盖此案例。这很简单, r['_id'] 是您要查找的自动生成的 ID 号。 :)
    • 现在必须提供“body”参数而不是“q”参数body={ 'query': { 'term': { 'name': 'Jacobian' } } }
    【解决方案2】:

    Delete-By-Query API 在版本 2 中已从 ES 核心中移除,原因有几个。这个函数变成了一个插件。您可以在此处查看更多详细信息:

    Why Delete-By-Query is a plugin

    Delete By Query Plugin

    因为我不想添加另一个依赖项(因为我以后需要它在 docker 映像中运行),所以我编写了一个自己的函数来解决这个问题。我的解决方案是搜索具有指定索引和类型的所有引号。之后我使用 Bulk 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
    

    我希望这对未来的谷歌员工有所帮助;)

    【讨论】:

    【解决方案3】:

    也可以这样做:

    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'])
    

    哪个会对批量数据执行删除操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      相关资源
      最近更新 更多