ElasticSearch组合multi_match与must_not查询解析报错如何解决
报错原因
你的must_not写法不符合Elasticsearch DSL语法规则,核心问题有两个:
must_not是bool查询的同级子属性,和filter、must、should平级,接收的参数是查询条件对象组成的数组,不能直接写字段和值的映射结构- 你写的
{"message":{"values":[...]}}不是ES支持的合法查询语法,不存在这种字段下直接挂values数组的写法
正确查询语句
如果你的需求是:message字段包含_single_、时间在指定区间,只要message包含任意一个排除关键词就过滤掉,可以直接用下面的完整语句:
{ "size": 9999, "_source": ["@timestamp", "message"], "query": { "bool": { "filter": [ { "range": { "@timestamp": { "gte": "2022-06-01T07:54:45.00Z", "lte": "2022-06-30T07:54:45.00Z" } } }, { "multi_match": { "fields": ["message"], "query": "_single_" } } ], "must_not": [ { "multi_match": { "fields": ["message"], "query": "set_by_lua buffered forbidden 403 302" } } ] } } }
注意:你之前写的排除关键词前后带了多余空格,会导致匹配不到关键词前后没有空格的场景(比如日志里
403直接跟在标点旁边、或者在字段首尾),如果不是明确要求匹配前后带空格的词,建议去掉这些多余空格。
如果你的排除逻辑是必须同时包含所有5个关键词才过滤,把must_not部分替换成下面的写法即可:
"must_not": [ {"match": {"message": "set_by_lua"}}, {"match": {"message": "buffered"}}, {"match": {"message": "forbidden"}}, {"match": {"message": "403"}}, {"match": {"message": "302"}} ]
之前抛出的解析错误,本质是ES读取到must_not或filter下的内容不符合预设的DSL结构,和你把语句放在哪个层级没有关系,修正语法结构后即可正常运行。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

