通过筛选查询删除时,Elasticsearch意外结果

时间:2015-06-06 10:24:08

标签: elasticsearch

我试图删除一组与具有特定值的字段不匹配的文档,方法是通过DELETE请求将以下数据发送到“localhost:9200 / products / phone”:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": []
      },
      "filter": {
        "bool": {
          "must": [],
          "should": [],
          "must_not": {
            "term": {
              "batch": 1433585920
            }
          }
        }
      }
    }
  }
}

但是此查询最终会删除/ products / phone类型的所有文档,包括“批处理”中具有1433586041值的文档。我做错了什么?

1 个答案:

答案 0 :(得分:1)

删除您正在执行此操作的方式是删除索引的类型phone

curl -XDELETE host:9200/products/phone -d '{ ... }'

在这种情况下,请求有效负载将被忽略。 You need to use the _query endpoint

curl -XDELETE host:9200/products/phone/_query -d '{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "batch": 1433585920
            }
          }
        }
      }
    }
  }
}'

所有这些都说Delete By Query is a little bit trappy and I suggest that you do not use itgoal is to completely rewrite it,但尚未发生 - 因此建议使用Scan / Scroll API查找与您的过滤器匹配的文档,然后使用批量API按ID删除它们。这是更多的努力,但它将是一个更好的集群稳定性解决方案,直到重写“按查询删除”端点。