【问题标题】:Delete records from Elasticsearch by query通过查询从 Elasticsearch 中删除记录
【发布时间】:2016-07-21 21:35:29
【问题描述】:

我正在尝试从 Elasticsearch 中删除特定日期记录。我的查询如下:

curl -XDELETE 'http://localhost:9200/twitter/twit/_query' -d '
{
    "filter" : {
            "range" : {
                "date_time" : { "from" : "2012-10-01 00:00:01", "to" : "2013-05-01 11:59:59"}
            }
        }
}'

但它不会删除任何记录。所以这是正确的一种还是有其他方法可以删除记录。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    在 1.0 之前,按查询删除不使用过滤器。语法直接指向搜索 API 中的“查询”块。您需要改用range query

    curl -XDELETE 'http://localhost:9200/twitter/twit/_query' -d '
    {
        "range" : {
            "date_time" : { "from" : "2012-10-01 00:00:01", "to" : "2013-05-01 11:59:59"}
        }
    }'
    

    【讨论】:

    • 或者您可以使用过滤查询并为其添加过滤器。不同之处在于过滤器被缓存并且性能更高。
    • 我相信当您查询删除时,您希望避免使用缓存结果。
    • 为什么?我想这取决于域和您执行的查询类型。在这种情况下,这并不是要获得不同的结果,而是要更快地获得结果。但在某些情况下,您确实希望避免缓存只执行一次的繁重过滤器(顺便说一下,您可以使用 elasticsearch 来实现)。
    【解决方案2】:

    自 2.0 起已弃用按查询删除。使用滚动/扫描查找要删除的所有文档 ID 并按 ID 调用删除

    在 1.5.3 中已弃用。

    “查询删除将在 2.0 中删除:这是有问题的,因为它 静默强制刷新,这会很快导致 OutOfMemoryError 在并发索引期间,也可能导致主副本和副本 变得不一致。相反,使用滚动/扫描 API 来查找所有 匹配 ID,然后发出批量请求以删除它们..

    https://www.elastic.co/guide/en/elasticsearch/reference/1.7/docs-delete-by-query.html

    还有一个delete-by-query 插件可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 2016-11-30
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多