使用elasticsearch的fields和partial_fields自定义限制字段


为了提高python elasticsearch的调用性能,从各方面都要小心注意。首先是在大量数据查询及导数的时候,要尽量的精简下返回的结果,去除那些不需要的字段。

在通过elasticsearch查询数据时候,不想显示所有字段,就在request Dsl请求语句里面增加了fields字段进行控制,结果遇到提示 isn’t a leaf field 的问题。

文章写的不严谨,后续有更新 ! 这里标注下原文地址 :

http://xiaorui.cc/2015/11/05/%E4%BD%BF%E7%94%A8elasticsearch%E7%9A%84fields%E5%92%8Cpartial_fields%E8%87%AA%E5%AE%9A%E4%B9%89%E9%99%90%E5%88%B6%E5%AD%97%E6%AE%B5/


一开始以为这可能是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… …


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. 游客 2016年4月29日 / 下午5:24

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

发表评论

邮箱地址不会被公开。 必填项已用*标注