ElasticSearch系列03:ES的数据类型
引⾔:上⼀节,我们学习了ES的基本概念和ES的数据架构【关注公众号:ZeroTeHero,获取上节内容】。今天,TeHero将为⼤家讲解ES的数据类型。
数据的存储,都是需要预先确定好数据的类型的,不管是关系型数据库mysql还是⾮关系型数据库MongoDB,都有⼀套数据类型系统(两者很类似,但也有区别)。那么ES的数据类型有哪些呢?TeHero为你倾情讲解^~^。
ES的数据类型汇总
ES数据类型汇总图(注意标红的类型)
从上图可以看到ES的数据类型和mysql或MongoDB的是很相似的,所以对于有数据结构基础的伙伴,这个知识点是⾮常轻松的。
TeHero将详细为⼤家介绍上图中标红的4种数据类型(数值类型就很⼀⽬了然)【ps:如果你还想了解其他的类型,可以直接进ES的官⽹阅读】,让⼤家在以后的⼯作中能熟练使⽤,知道什么时候该⽤哪种类型,该怎么⽤。
⼀、String 类型
String类型可以和java的string、mysql的varchar等同,但是为何会分为text、keyword呢?这两者⼜有什么区别?
ES作为全⽂检索引擎,它强⼤的地⽅就在于分词和倒排序索引。⽽ text 和 keyword 的区别就在于是否分词(ps:什么叫分词?举个简单例⼦,“中国我爱你”这句话,如果使⽤了分词,那么这句话在底层的储存可能就是“中国”、“我爱你”,被拆分成了两个关键字),分词后⾯TeHero会专门写⽂章进⾏讲解,敬请期待哟。【关注公众号:ZeroTeHero,获取最新⽂章推送】
1)text——会分词
就拿刚才的例⼦来说,“中国我爱你”这句话,如果使⽤text类型储存,我们不去特殊定义它的分词器,那么ES就会使⽤默认的分词器standard 。
ES的分词器(可先有个概念)
下图就是“中国我爱你”的ES分词效果:
这意味着什么呢?如果你使⽤text类型去储存你本不想分词的string类型,你在查询的时候,查询结果将违背你的预期。简单看个⽰例:
# 创建索引
PUT /toherotest
{
"mappings": {
"_doc":{
"properties" : {
"field1" : { "type" : "text" }
}
}
}
}
# 存⼊数据
POST /toherotest/_doc/1
{
"field1":"中国我爱你"
}
# 查询 索引下的所有数据
GET /toherotest/_doc/_arch
条件查询,等价于mysql的 where field1 = "中国我爱你" 。发现居然查询不到
GET /toherotest/_doc/_arch
{
"query": {
"term": {
"field1": {
"value": "中国我爱你"
}
}
}
}
再根据刚才的ES分词效果,我们检索其中⼀个字,居然神奇的检索到了
GET /toherotest/_doc/_arch
{
"query": {
"term": {
"field1": {
"value": "中"
}
}
}
}
这是为什么呢?我们发现在使⽤term查询(等价于mysql的=)时却查不到结果,其实就是因为text类型会分词,简单理解就是“中国我爱你”这句话在ES的倒排序索引中存储的是单个字,所以⽆法检索。
2)keywor——不会分词
我们新增⼀个keyword类型的字段field2,再来看看检索效果: