添加filter_path至ElasticSearch查询时出现格式错误问题求助
问题根源:
filter_path放错位置了! 哦,这个坑我太熟了!你把filter_path塞到查询DSL的bool节点里了,但它根本不是查询语法的一部分!filter_path是Elasticsearch请求级别的参数,作用是过滤返回的响应字段,不能和查询DSL混在一起。你现在把它放在bool对象里,ES的语法解析器完全不认识这个字段,直接就判定查询格式错误了。
修正方案分两步走
1. 先把查询体还原成合法的DSL结构
把filter_path从你的query函数里移除,让查询只保留ES能识别的语法:
def query(options = {}) aggregations = {} buckets = {} buckets_for_unique_users buckets, aggregations filters = [] filters << time_filter(options) # 移除了非法的filter_path字段,只保留合法的查询和聚合结构 query_body = { query: { bool: { filter: filters } }, aggregations: buckets } query_body end
2. 在调用ES客户端时单独传递filter_path
filter_path应该作为请求参数,和查询体分开传递。比如用Ruby的elasticsearch-ruby客户端的话,调用方式是这样的:
# 假设client是你的Elasticsearch客户端实例 response = client.search( index: 'your_target_index', body: query(options), # 这里单独传filter_path参数,格式是字符串数组 filter_path: ['unique_users', 'unique_users.user_details.hits.hits._id'] )
关于之前的错误提示
你提到的[bool]格式错误,期望[END_OBJECT]却找到[FIELD_NAME],原因很直白:Elasticsearch的bool查询节点只接受must、should、must_not、filter这几个固定字段。当解析到bool对象里的filter_path时,它本来以为bool对象要结束了(期望END_OBJECT),结果突然冒出来一个陌生的字段名(FIELD_NAME),直接就报错了。
内容的提问来源于stack exchange,提问作者Ravindra Yadav
相关产品推荐
相关产品推荐

