前端调用带多查询参数的Elasticsearch API报错求助
问题描述
我在前端调用公共艺术品API(https://api.artic.edu/api/v1/artworks/search)展示作品时遇到了问题:
- 单独使用
query[match][place_of_origin]=france筛选法国产地的作品,返回结果正常 - 单独使用
query[term][title]=night搜索标题含night的作品,返回结果也正常 - 但同时组合这两个查询参数发起GET请求时,直接返回400 Bad Request错误
推测后端基于Elasticsearch实现,目前不清楚如何将Elasticsearch的多条件JSON查询转换为合法的URL查询参数,需要正确的组合方式。
错误响应如下:
{ "error": { "root_cause": [ { "type": "parsing_exception", "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]", "line": 1, "col": 416 } ], "type": "x_content_parse_exception", "reason": "[1:416] [bool] failed to parse field [must]", "caused_by": { "type": "x_content_parse_exception", "reason": "[1:416] [bool] failed to parse field [should]", "caused_by": { "type": "x_content_parse_exception", "reason": "[1:416] [bool] failed to parse field [must]", "caused_by": { "type": "x_content_parse_exception", "reason": "[1:416] [bool] failed to parse field [must]", "caused_by": { "type": "parsing_exception", "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]", "line": 1, "col": 416 } } } } }, "status": 400 }
解决方案
问题出在URL参数的嵌套结构拼接逻辑上,直接叠加两个query开头的参数会导致后端解析Elasticsearch查询结构时出现混淆。正确的做法是将多个查询条件合并到同一个query的bool逻辑分支下,具体格式如下:
多条件同时满足(must逻辑)
要实现产地为法国且标题含night的过滤,使用以下URL参数组合:
query[bool][must][0][match][place_of_origin]=france&query[bool][must][1][term][title]=night
逻辑说明
query[bool][must]对应Elasticsearch中需要同时满足的条件组- 用数组下标
[0]、[1]区分不同的查询条件,对应Elasticsearchmust数组中的元素 - 第一个条件
[0][match][place_of_origin]=france是匹配产地的match查询 - 第二个条件
[1][term][title]=night是匹配标题的term查询
其他逻辑关系示例
如果需要满足任一条件(should逻辑),只需将must替换为should:
query[bool][should][0][match][place_of_origin]=france&query[bool][should][1][term][title]=night
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

