我正在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'}}]}
}
}
我在这里做什么错了?
答案 0 :(得分:2)
filter
子句(查询)必须出现在匹配的文档中。但是不像 必须忽略查询的分数。过滤子句是 在过滤器上下文中执行,这意味着计分被忽略,并且 子句考虑用于缓存。
must_not
子句(查询)不得出现在匹配的文档中。条款 在过滤器上下文中执行,这意味着计分被忽略,并且 子句考虑用于缓存。由于计分被忽略,因此 所有文档的分数都返回0。
filter
和must_not
都是bool
查询的子句,它们以相同的方式工作。要使用must_not
,则需要删除filter
:
{
'size': 10000,
'query': {
'bool': {
'must_not': {
'term': {
'status': 'ok'
}
}
}
}
}