【问题标题】:ElasticSearch - Delete documents by specific fieldElasticSearch - 按特定字段删除文档
【发布时间】:2022-03-02 22:53:25
【问题描述】:

这个看似简单的任务在 ElasticSearch 文档中没有详细记录:

我们有一个 ElasticSearch 实例,其索引中有一个名为 sourceId 的字段。我将首先对GETsourceId 字段中具有 100 的所有文档进行什么 API 调用(以在删除前验证结果),然后对 DELETE 相同的文档进行调用?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可能需要在此处进行两次 API 调用。第一个查看文档计数,第二个执行删除。

    查询是相同的,但端点不同。另外我假设sourceId 的类型为keyword

    查询验证

    POST <your_index_name>/_search
    {
      "size": 0,
      "query": {
        "term": {
          "sourceId": "100"
        }
      }
    }
    

    执行上面的Term Query,并在回复的hits.total处记下。

    如果您想查看整个文档作为响应,请删除上述查询中的"size":0

    获得详细信息后,您可以继续使用以下查询中所示的相同查询执行删除,但请注意端点。

    要删除的查询

    POST <your_index_name>/_delete_by_query
    {
      "query": {
        "term": {
          "sourceId": "100"
        }
      }
    }
    

    执行Deletion By Query 后,请注意响应中的deleted 字段。它必须向您显示相同的数字。

    我使用了术语查询,但是您也可以使用任何 Match 或任何复杂的 Bool Query。只要确保查询是正确的。

    希望对你有帮助!

    【讨论】:

    • 嗨,Kamal,感谢您的回答。实际上 sourceId 类型很长。这对您的答案有何影响?
    • @Stpete111 从技术上讲,它没有。只是不需要在100 周围使用double quotes。这意味着它将类似于"sourceId": 100
    【解决方案2】:
    POST /my_index/_delete_by_query?conflicts=proceed&pretty
    {
      "query": {
        "match_all": {}
      }
    }
    

    删除一个索引的所有文档而不删除映射和设置: 见:https://opster.com/guides/elasticsearch/search-apis/elasticsearch-delete-by-query/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多