ElasticSearch系列03:ES的数据类型

更新时间:2023-05-09 20:46:33 阅读: 评论:0

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,再来看看检索效果:

本文发布于:2023-05-09 20:46:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/875890.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   分词   查询
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图