为了提高python elasticsearch的调用性能,从各方面都要小心注意。首先是在大量数据查询及导数的时候,要尽量的精简下返回的结果,去除那些不需要的字段。
在通过elasticsearch查询数据时候,不想显示所有字段,就在request Dsl请求语句里面增加了fields字段进行控制,结果遇到提示 isn’t a leaf field 的问题。
文章写的不严谨,后续有更新 ! 这里标注下原文地址 :

一开始以为这可能是elasticsearch的小bug ,所以直接在github中提交了issue ,https://github.com/elastic/elasticsearch/issues/14542 ,有些尴尬呀….
凡事遇到问题先别定结论,还是老老实实地看文档吧… 在elasticsearch官方文档里面抽取了两个关于fields的例子。
fields可以是列表。
{
"fields" : ["user", "postDate"],
"query" : {
"term" : { "user" : "kimchy" }
}
}
partial_fields的功能有些类似_source过滤嵌套的字典。 但显然partial_fields更加的强大,他可以控制字典的显示的层级。
{
"query" : {
"match_all" : {}
},
"partial_fields" : {
"partial1" : {
"include" : "source.url"
}
}
}
{
"query" : {
"match_all" : {}
},
"partial_fields" : {
"partial1" : {
"include" : ["obj1.obj2.*", "obj1.obj4.*"],
"exclude" : "obj1.obj3.*"
}
}
}
还原下出错的经过. 话说在2.0的文档上,没找到有关_source讲述.
{
"fields": "keyword",
"size":10
}
#下面是返回结果...
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 30,
"successful": 29,
"failed": 1,
"failures": [
{
"index": "xxxx",
"shard": 0,
"status": 400,
"reason": "RemoteTransportException[[Gazelle][inet[/xxxxxxx:9300]][indices:data/read/search[phase/fetch/id]]]; nested: ElasticsearchIllegalArgumentException[field [keyword] isn't a leaf field]; "
}
]
},
"hits": {
"total": 26528,
"max_score": 1,
"hits": []
}
}
如何解决这个问题…
{
"_source": [
"keyword"
]
}
ElasticsearchIllegalArgumentException[field [keyword] isn’t a leaf field] 的意思是说,keyword这个字段是个叶子节点,fields不支持非叶子节点。
简单的说,如果一个字段是嵌套的情况,我们不能使用fields来控制字段显示,可以使用_source和partial_fields,新版的elasticsearch推荐使用partial_fields.
END… …

还是我ddos你吧 ,你签名好牛 逼