Elasticsearch v2升级v6后复杂OR/AND查询语法错误求解
嘿,这个问题我熟!你遇到的报错是因为ES从v2升级到v6后,布尔查询的语法规则变了——v6+里已经没有or或者and这种直接的查询类型了,所有逻辑组合都得靠bool查询的子句来实现。
先拆解下你原来的错误:你把or当成了一个查询类型来用,但ES根本不认识它,所以才会抛出no [query] registered for [or]的报错。
接下来根据你的需求给你几种正确写法:
情况1:你需要的是「CUSTNR=24508 AND ORDERNR前缀是128」
也就是两个条件必须同时满足,用bool的must子句(数组形式,里面的条件是AND关系):
{ "index": "<index>", "type": "<type>", "body": { "from": 0, "size": 20, "query": { "bool": { "must": [ { "match": { "CUSTNR": "24508" } }, { "prefix": { "ORDERNR": "128" } } ] } } } }
情况2:你需要的是「CUSTNR=24508 OR ORDERNR前缀是128」
也就是满足其中一个条件即可,用bool的should子句,再加上minimum_should_match:1确保至少匹配一个(如果只有should子句,默认也是至少匹配一个,但显式写上更清晰):
{ "index": "<index>", "type": "<type>", "body": { "from": 0, "size": 20, "query": { "bool": { "should": [ { "match": { "CUSTNR": "24508" } }, { "prefix": { "ORDERNR": "128" } } ], "minimum_should_match": 1 } } } }
如果是更复杂的嵌套逻辑(比如(A OR B) AND C)
还可以嵌套bool查询,比如要同时满足「(CUSTNR=24508 OR ORDERNR前缀是128) AND STATUS=ACTIVE」:
{ "index": "<index>", "type": "<type>", "body": { "from": 0, "size": 20, "query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "CUSTNR": "24508" } }, { "prefix": { "ORDERNR": "128" } } ], "minimum_should_match": 1 } }, { "match": { "STATUS": "ACTIVE" } } ] } } } }
最后再划个重点:ES v6+的布尔查询核心就是bool+三个子句:
must:所有条件必须满足(AND关系)should:至少满足指定数量的条件(OR关系,用minimum_should_match控制匹配数量)must_not:所有条件都不能满足(NOT关系)
内容的提问来源于stack exchange,提问作者rcc
相关产品推荐
相关产品推荐

