我们在使用Elasticsearch不免会遇到像int、double这种数值类型,Elasticsearch本身也是支持这些类型的,但并不意味着数字就一定要用数值类型,恰恰相反,用keyword有时候性能会更好,包括对数值进行range。博主生产上就出现过对数值类型range非常慢的情况。本文将详细介绍Elasticsearch中关于数值类型的使用和数值类型查询原理与keyword的区别。
#Elasticsearch中数据类型
本来想自己总结一下的,无意中发现了一篇文章,总结的很详细,瞬间打消了我的念头。直接搬来:https://blog.csdn.net/chengyuqiang/article/details/79048800
好,回来我们已经大概了解了Elasticsearch中有哪些数据类型,本文我们主要探讨其中的数值类型。
#Elasticsearch是如何存储数值类型的?
在了解Elasticsearch如何存储数据数值类型之前,需要了解Lucene是如何存储索引数据的。参考:Elasticsearch原理(二):索引存储方式
#版本的区别
Elasticsearch中对于数值类型的存储在5.X版本之后有一个重要的变化。从Elasticsearch5.x开始,Elasticsearch开始使用Lucene6.0版本,而Lucene6.0版本对于Lucene来说有非常大的改变,随之带来的是Elasticsearch有很大的改变。(但这并不是Elasticsearch从2.x跳到5.x的原因,之所以跳版本是为了ELK的版本统一。)
在Lucene6.0之前对于数据的索引只支持字符串,虽然表面上是支持其他类型,但最终都是转成了字符串进行倒排索引的。
这种方式最大的好处就是直接通过term进行查询,速度非常快。但也有弊端,对于数值类型的range查询就非常的笨重。比如说range[1,50],它实际上是转换成了bool中的or,就像(1 or 2 or 3 or 4 … or 50)。如果range一个很大的范围的话,效率可想而知。于是Lucene做了一定优化,把range[1,10]、range[11&#x