Elasticsearch请求报错:不支持_source/docvalue_fields参数,求解决
问题原因与解决方案
1. 修复Bool查询的语法错误
你的查询语句里,bool.must数组的第一个元素把两个match查询放在了同一个JSON对象中,这是无效的Elasticsearch DSL语法——每个查询条件必须作为数组的独立元素存在。这种语法错误会导致Elasticsearch无法正确解析整个请求,进而抛出看似和_source相关的解析异常。
错误写法:
{ "match": { "type": DEFAULT_LOG_TYPE }, "match": { "namespace": namespace } }
正确写法:
{ "match": { "type": DEFAULT_LOG_TYPE } }, { "match": { "namespace": namespace } }
2. 确认API端点合法性
如果修复语法后仍报错,检查你调用的Elasticsearch API端点:
_source和docvalue_fields是**_search/_search/template**端点的合法参数- 若误调用
_count、_validate/query等不支持返回字段控制的端点,会直接抛出"不支持[_source]"的错误
3. 完整修正后的查询示例
range_query = { "query": { "bool": { "must": [ { "match": { "type": DEFAULT_LOG_TYPE } }, { "match": { "namespace": namespace } }, { "range": { "@timestamp": { "gte": ts, "lte": te } } } ] } }, "_source": ["message", "@timestamp"] }
额外验证步骤
- 先在Kibana Dev Tools中运行修正后的DSL,排除DSL本身的问题:
GET /my_index/_search { "query": { "bool": { "must": [ {"match": {"type": "your_default_type"}}, {"match": {"namespace": "your_namespace"}}, {"range": {"@timestamp": {"gte": "your_start_ts", "lte": "your_end_ts"}}} ] } }, "_source": ["message", "@timestamp"] } - 若Kibana中能正常返回结果,再移植到Python代码中排查其他代码层面问题
内容的提问来源于stack exchange,提问作者safa
相关产品推荐
相关产品推荐

