为了提高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你吧 ,你签名好牛 逼