Elasticsearch 7.0:过滤器must_not查询错误

时间:2019-04-26 14:31:35

标签: python elasticsearch

我正在Windows 8机器上使用elasticsearch-py 7.0和elasticsearch服务器7.0。

我有这个查询:

{
    'size': 10000, 
    'query': {
        'bool': {'must_not': {'filter': [{'term': {'status': 'ok'}}]}
        }
    }
}

映射是这样的:

  "mappings": {
      "properties": {
         "name": {"type": "text"},
         "status": {"type": "keyword"},
         "date": {"type":"date"}
      }
    }

它遵循docs for boolean query中指定的规则,但是由于抛出语法错误而无法使用:

  

RequestError:RequestError(400,“ parsing_exception”,“未为[过滤器]注册任何[查询]”)

但是,如果我删除了“ must_not”元素,它将起作用:

{
    'size': 10000, 
    'query': {
        'bool': {'filter': [{'term': {'status': 'ok'}}]}
    }
}

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

  

filter

     

子句(查询)必须出现在匹配的文档中。但是不像   必须忽略查询的分数。过滤子句是   在过滤器上下文中执行,这意味着计分被忽略,并且   子句考虑用于缓存。

     

must_not

     

子句(查询)不得出现在匹配的文档中。条款   在过滤器上下文中执行,这意味着计分被忽略,并且   子句考虑用于缓存。由于计分被忽略,因此   所有文档的分数都返回0。

filtermust_not都是bool查询的子句,它们以相同的方式工作。要使用must_not,则需要删除filter

{
  'size': 10000,
  'query': {
    'bool': {
      'must_not': {
        'term': {
          'status': 'ok'
        }
      }
    }
  }
}