1.1 核心数据类型
字符串型:text(分词)、keyword(不分词)
数值型:long、integer、short、byte、double、float、half_float、scaled_float
日期类型:date
布尔类型:boolean
二进制类型:binary
范围类型:integer_range、float_range、long_range、double_range、date_range
1.2 复杂数据类型
数组类型:array
对象类型:object
嵌套类型:nested object
1.3 地理位置数据类型
geo_point(点)、geo_shape(形状)
1.4 专用类型
记录IP地址ip
实现自动补全completion
记录分词数:token_count
记录字符串hash值murmur3
多字段特性multi-fields
ES常用的数据类型可分为3大类
- 核⼼数据类型
- 复杂数据类型
- 专⽤数据类型
核心数据类型
(1)字符串
- text ⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配
- keyword 不分词,搜索时需要匹配完整的值
(2)数值型
- 整型: byte,short,integer,long
- 浮点型: float, half_float, scaled_float,double
(3)日期类型
- date
json没有date类型,插入|更新文档|字段时怎么表示date类型?
#mapping,将字段类型设置为date "type" : "date"
#插入|更新此字段的值时,有3种表示方式
#使用固定格式的字符串 "2020-04-18"、"2020/04/18 09:00:00"
#值使用长整型的时间戳,1970-01-01 00:00:00,s 1610350870
#值使用长整型的时间戳,ms 1641886870000
(4)范围型
integer_range, long_range, float_range,double_range,date_range
比如招聘要求年龄在[20, 40]上,mapping:
age_limit :{ "type" : "integer_range" }
插入|更新文档|字段时,值写成json对象的形式:
"age_limit" : { "gte" : 20, "lte" : 40 }
gt是大于,lt是小于,e是equals等于。
按此字段搜索时,值写常量:
"term" : { "age_limit" : 30 }
age_limit的区间包含了此值的文档都算是匹配。
(5)布尔
- boolean #true、false
(6)⼆进制
- binary 会把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
复杂数据类型
(1)对象
- object
#定义mapping "user" : { "type":"object" }
#插入|更新字段的值,值写成json对象的形式 "user" : { "name":"chy", "age":12 }
#搜索时,字段名使用点号连接 "match":{ "user.name":"chy" }
一个对象中可以嵌套对象。
(2)数组
#ES没有专门的数组类型,定义mapping,写成元素的类型 "arr" : { "type":"integer" }
#插入|更新字段的值。元素可以是各种类型,但元素的类型要相同 "arr" : [1,3,4]
专用数据类型
- ip
#定义mapping "ip_address" : { "type":"ip" }
#插入|更新字段的值,值写成字符串形式 "ip" : "192.168.1.1"
#搜索 "match":{ "ip_address":"192.168.1.1" }
#ip在192.168.0.0 ~ 192.168.255.255上的文档都匹配 "match":{ "ip_address":"192.168.0.0/16" }
2.1 手动创建
1)创建操作
2)创建文档
3)查询
2.2 自动创建
ES可以自动识别文档字段类型,从而降低用户使用成本
1)直接插入文档
2)查看mapping
birth自动识别为long类型,name识别为text类型
3)日期类型的自动识别
日期的自动识别可以自行配置日期格式,以满足各种需求。
(1)自定义日期识别格式
(2)关闭日期自动识别
4)字符串是数字时,默认不会自动识别为整形,因为字符串中出现数字时完全合理的
3.1 为什么使用分词器
分词器主要应用在中文上,在ES中字符串类型有keyword和text两种。keyword默认不进行分词,而text是将每一个汉字拆开称为独立的词,这两种都是不适用于生产环境,所以我们需要有其他的分词器帮助我们完成这些事情,其中IK分词器是应用最为广泛的一个分词器。
1)keyword类型的分词
结果展示(报错),因为keyword不支持分词
2)text类型的分词
结果展示:
3.2 IK分词器安装
1)下载与安装的ES相对应的版本
2)解压elasticsearch-analysis-ik-6.6.0.zip,将解压后的IK文件夹拷贝到ES安装目录下的plugins目录下,并重命名文件夹为ik(什么名称都OK)
3)分发分词器目录
4)重新启动Elasticsearch,即可加载IK分词器
3.3 IK分词器测试
IK提供了两个分词算法ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分。
1)最少划分ik_smart
结果展示
2)最细切分ik_max_word
向Elasticsearch增加数据
如果在关系型数据库Mysql中主键查询数据一般会执行下面的SQL语句
但在Elasticsearch中需要采用特殊的方式
响应
我们通过HTTP方法GET来检索文档,同样的,我们可以使用DELETe方法删除文档,使用HEAD方法检查某文档是否存在。如果想更新已存在的文档,我们只需再PUT一次。
4.1 元数据查询
4.2 全文档检索
如果在关系型数据库Mysql中查询所有数据一般会执行下面的SQL语句
但在Elasticsearch中需要采用特殊的方式
响应内容不仅会告诉我们哪些文档被匹配到,而且这些文档内容完整的被包含在其中—我们在给用户展示搜索结果时需要用到的所有信息都有了。
4.3 字段全值匹配检索
如果在关系型数据库Mysql中查询多字段匹配数据(字段检索) 一般会执行下面的SQL语句
但在Elasticsearch中需要采用特殊的方式,并且全值匹配会把查询条件当做一个整体来查。
4.4 字段分词匹配检索
分词匹配会按照检索条件将其分词后再去匹配
4.5 全值匹配和分词匹配结合使用
4.6 字段模糊匹配检索
如果在关系型数据库Mysql中模糊查询多字段数据 一般会执行下面的SQL语句
但在Elasticsearch中需要采用特殊的方式,查询出所有文档字段值分词后包含"我是程序"的文档
4.7 聚合检索
4.7.1 单聚合条件
聚合查询相当于MySQL中的group by GET student/_search
4.7.2 多聚合条件
此时这两个聚合条件相互之间是没有关联的,比如同班级下的学生和年龄最大的学生
4.7.3 聚合嵌套检索
此时这两个聚合条件相互之间是有关联的,比如同班级下年龄最大的学生
如果想实现看某一页的内容,或者跳转到某一页显示出其内容,可以将from的值设置为((页面数-1)*size)
4.9 查询时请求体中的关键字含义
索引别名就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名带给我们极大的灵活性,允许我们做下面这些:
1)给多个索引分组 (例如, last_three_months)
2)给索引的一个子集创建视图
3)在运行的集群中可以无缝的从一个索引切换到另一个索引
5.1 创建索引别名
1)建索引时直接声明
2)为已存在的索引增加别名
也可以通过加过滤条件缩小查询范围,建立一个子集视图
5.2 查询别名
与使用普通索引没有区别
5.3 删除某个索引的别名
5.4 为某个别名进行无缝切换
4.5.5 查询别名列表
Index Template 索引模板,顾名思义,就是创建索引的模具,其中可以定义一系列规则来帮助我们构建符合特定业务需求的索引的mappings和 settings,通过使用 Index Template 可以让我们的索引具备可预知的一致性。
6.1 常见的场景: 分割索引
这样做的好处有两个:
结构变化的灵活性:因为elasticsearch不允许对数据结构进行修改。但是实际使用中索引的结构和配置难免变化,那么只要对下一个间隔的索引进行修改,原来的索引位置原状。这样就有了一定的灵活性。
查询范围优化:因为一般情况并不会查询全部时间周期的数据,那么通过切分索引,物理上减少了扫描数据的范围,也是对性能的优化。
6.2 创建模板
其中 “index_patterns”: [“movie_test*”], 的含义就是凡是往movie_test开头的索引写入数据时,如果索引不存在,那么es会根据此模板自动建立索引。 在 “aliases” 中用{index}表示,获得真正的创建的索引名。
测试
6.3 查看系统中已有的模板清单
6.4 查看某个模板详情
或者