Elasticsearch如何在请求体中指定search_type?报错原因及解决方法
为什么无法在请求体中指定
search_type?怎么用Chewy解决? 你遇到的这个解析错误,本质是Elasticsearch的API设计规则导致的:search_type是URL专属的控制参数,根本不属于搜索请求体的合法字段。
具体原因
Elasticsearch把search_type这类控制搜索执行模式(比如分布式搜索的阶段逻辑)的参数,限定为URL参数传递,请求体的Schema里并没有定义这个字段。所以当你把search_type放进请求体时,ES的解析器会识别出这个未知字段,直接抛出parsing_exception,就像你看到的错误:
{ "error": { "root_cause": [ { "type": "parsing_exception", "reason": "Unknown key for a VALUE_STRING in [search_type].", "line": 1, "col": 19 } ], "type": "parsing_exception", "reason": "Unknown key for a VALUE_STRING in [search_type].", "line": 1, "col": 19 }, "status": 400 }
用Chewy解决的方案
Chewy作为Ruby的Elasticsearch客户端,完全支持传递URL参数,你有两种实用的方式:
1. 单请求附加URL参数
在调用search方法时,通过第二个参数的params选项传入search_type:
TestClaimVideosIndex.search( { explain: true, query: { bool: { must: { multi_match: { query: "funny", fields: ["title", "asset_name", "description", "tags.name", "asset_group_name.humanized", "credit"] } } } } }, params: { search_type: "dfs_query_then_fetch" } )
这个写法会让Chewy自动把search_type作为URL参数附加到请求上,和你手动在URL里写?search_type=dfs_query_then_fetch的效果完全一致,完全符合ES的要求。
2. 为索引全局设置默认参数
如果这个索引的所有搜索都需要使用dfs_query_then_fetch模式,你可以在索引定义里配置default_params,一劳永逸:
class TestClaimVideosIndex < Chewy::Index # 全局默认启用dfs_query_then_fetch模式 default_params search_type: "dfs_query_then_fetch" # 这里添加你的索引映射、设置等定义 # ... end
之后这个索引发起的所有搜索请求,都会自动带上这个URL参数,不用每次都手动指定。
效果验证
用上述方式后,Chewy发送的请求会和你之前正常运行的示例完全一致:
GET /test_claim_videos/_search?search_type=dfs_query_then_fetch { "explain": true, "query": { "bool": { "must": { "multi_match": { "query": "funny", "fields": ["title", "asset_name", "description", "tags.name", "asset_group_name.humanized", "credit"] } } } } }
这样就不会再触发解析错误了。
内容的提问来源于stack exchange,提问作者Saurav Prakash
相关产品推荐
相关产品推荐

