painless数字类型转换_painless获取doc字段的方式「建议收藏」

如果你写painless脚本的时候,发现对不同结构的字段获取有点困惑,那么本文可能会帮助你。取普通字段默认ES会把非text、非nested的字段存到docvalues列存储中,方便单独获取,而不用取_source里取,这样IO性能就很好。假设你有一个字段:”a”:1。那么doc[‘a’]返回的是[1],是一个数组。doc[‘a’].value返回的是1,也就是取第一个元素。doc[‘a’]….

大家好,又见面了,我是你们的朋友全栈君。

如果你写painless脚本的时候,发现对不同结构的字段获取有点困惑,那么本文可能会帮助你。

取普通字段

默认ES会把非text、非nested的字段存到doc values列存储中,方便单独获取,而不用取_source里取,这样IO性能就很好。

假设你有一个字段:”a”: 1。

那么doc[‘a’]返回的是[1],是一个数组。

doc[‘a’].value返回的是1,也就是取第一个元素。

doc[‘a’].values与doc[‘a’]表现一致,返回[1]。

特殊一点的是object类型的字段,ES底层存储时是key扁平化的,所以你应该直接这样取:

doc[‘xxx.yyy’]

doc[‘xxx.yyy’].value

doc[‘xxx.yyy’].values

取非普通字段

主要指nested字段和text字段,它们不会进入doc values。

解决方法优先采用store: true属性,强制它们进入列存储中独立保存,这样获取的时候IO性能就好得多,但是性能没有doc values好。

获取store字段的方法和普通字段没有区别,仍旧走doc变量。

但是nested字段走store后,获取方式肯定不是doc[‘xxx.yyy’],而是遍历doc[‘xxx’].values数组,每个子doc再获取yyy(我没试验,大家可以试试)。

取_source

其实_source也是一个store存储,包含了整个你索引的json文档。

只是_source太大了,远不如把单个列独立store起来的性能好,所以最次的方法就是走_source。

在修改操作时需要_ctx._source获取,在查询操作时需要params._source获取,上下文不同写法不同。

其他

doc values取到的数据类型,一定是与mapping一致的,经过约束转换的。

而走store和_source取到的数据类型,则是你索引时原样放入的数据类型,比如mapping是一个int字段,你索引时设置了一个”123″,其实doc values会存123,然而_source和store中仍旧是”123″,所以写painless脚本就会遇到一个类型问题,需要先判断是不是字符串”123″(用def+instanceof判断),如果是还得转换成整形才能运算,是很头疼的。

如果文章帮助了你,请帮我点击1次谷歌广告,或者微信赞助1元钱,感谢!

painless数字类型转换_painless获取doc字段的方式「建议收藏」

知识星球有更多干货内容,对我认可欢迎加入:

painless数字类型转换_painless获取doc字段的方式「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127273.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 小学语文历史重点名人以及解析大全

    小学语文历史重点名人以及解析大全【人物1】:司马光【简介】:司马光(1019~1086),北宋时期著名政治家、史学家、散文家。北宋陕州夏县涑水乡(今山西运城安邑镇东北)人,汉族。出生于河南省光山县,字君实,号迂叟,世称涑水先生。司马光自幼嗜学,尤喜《春秋左氏传》。【相关故事】司马光砸缸司马光七岁的时候稳重的就像一个大人,听到老师讲解《左氏春秋》,非常喜爱,放学之后又为家人讲他所学到的,他立即也明白了《左氏春秋》的内涵,从此手里放不下书本,甚至到了忘记了饥渴,冷热的程度。有一次,他跟小伙伴们在后院里玩耍,有个小孩爬到大

    2022年5月7日
    73
  • java分布式框架_5个强大的Java分布式缓存框架推荐

    java分布式框架_5个强大的Java分布式缓存框架推荐在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦。本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展。1、Ehcache–Java分布式缓存框架Ehcache是一个Java实现的开源分布式缓存框架…

    2022年6月5日
    24
  • 3.1、Eclipse

    3.1、Eclipse

    2022年1月9日
    42
  • python pyc文件解析_pyc文件

    python pyc文件解析_pyc文件codeobject¶在我们导入python脚本时在目录下会生成个一个相应的pyc文件,是pythoncodeobj的持久化储存形式,加速下一次的装载。文件结构¶pyc文件由三大部分组成最开始4个字节是一个Maigcint,标识此pyc的版本信息接下来四个字节还是个int,是pyc产生的时间序列化的PyCodeObject,结构参照include/code.h,序列化方法pyth…

    2022年6月29日
    37
  • JS跳转代码_javascript跳转代码

    JS跳转代码_javascript跳转代码<scriptlanguage=”javascript”type=”text/javascript”>functionrequest(paras){varurl=location.href;varparaString=url.substring(url.indexOf(“?”)+1,url.length).split(“&”);varparaObj={}for(i=0;j=paraString[i];i++){paraObj[j.substrin

    2022年8月13日
    5
  • booth算法原理的简单化理解「建议收藏」

    booth算法原理的简单化理解「建议收藏」最近,在学习带符号二进制数乘法(multiplicationof signednumbers)时接触到了布思算法(boothalgorithm)。由于是第一次接触,对于其原理却一无所知,书上的解释以及网上的文章不知是自己才疏学浅还本来就是泛泛而谈,没有让我了解其本质。经过长时间的思考分析,最终找到了一种比较简单的理解方法。举一个简单的例子,比如说计算10100001×00111110,

    2022年10月23日
    0

发表回复

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

关注全栈程序员社区公众号