中间件篇-ElasticSearch7.x教程
一、 ElasticSerach 认识
1.1 索引 index
- 一个索引可以理解成一个关系数据库的库
1.2 类型 type
- 一种type就像一类表,比如user表,order表
1.3 映射 mapping
- mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结
1.4 文档 document
- 一个document相当于关系型数据库中的一⾏行行记录
1.5 字段 field
- 相当于关系型数据库表的字段
1.6 集群 cluster
-集群由一个或多个节点组成,一个集群有一个默认名称”elasticsearch”
1.7 节点 node
- 集群的节点,一台机器 或者一个进程
1.8 分片和副本 node
- 副本是分片的副本。分⽚有主分片(primary Shard)和副本分片(replica Shard)之分。Index数据在物理理上被分布在多个主分片中,每个主分片只存放部分数据。每个主分⽚可以有多个副本,叫副本分片,是主分片的复制。
1.9 核心数据类型
1.9.1 字符串:
- text
- 用于全文索引,该类型的字段将通过分词器 进⾏分词
- keyword
- 不分词,只能搜索该字段的完整的值
1.9.2 数值型
- long, integer, short, byte, double, float, half_float, scaled_float
1.9.3 数值型 boolean
- boolean
1.9.3 二进制
- binary
- 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
1.9.4 范围类型
- 范围类型表示值是一个范围,而不是⼀个具体的值
- integer_range, float_range, long_range, double_range, date_range
- 譬如 age 的类型是 integer_range,那么值可以是 {“gte” : 20, “lte” : 40};搜索 “term” : {“age”: 21} 可以搜索该值
1.9.5 日期
- date
- 由于Json没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型
- format默认为:strict_date_optional_time||epoch_millis
- “2022-01-01” “2022/01/01 12:10:30” 这种字符串格式
二、索引基本操作
基于Kibana进行操作
2.1 创建索引 PUT请求
- 请求
1 |
|
- 响应
1 |
|
2.2 查看索引 GET请求
- 请求
1 |
|
- 响应
点击展开
1 |
|
2.4 删除索引 DELETE请求
- 请求
1 |
|
- 响应
1 |
|
2.5 批量获取索引 GET请求
- 请求
1 |
|
- 响应
1 |
|
2.6 获取全部索引 GET请求
- 请求
1 |
|
2.7 使用_cat获取全部索引 GET请求
- 请求
1 |
|
- 响应
1 |
|
2.8 判断索引是否存在 HEAD请求
- 请求
1 |
|
- 响应
1 |
|
2.9 关闭索引 不删除 POST请求
- 请求
1 |
|
- 响应
1 |
|
2.10 打开索引 POST请求
- 请求
1 |
|
- 响应
1 |
|
三、映射的介绍与使用
- type: text 可分词
(划重点)
- type: keyword 不可分词
3.1 创建Mapping PUT请求
- 请求
1 |
|
- 响应
1 |
|
3.2 查看Mapping信息 GET请求
- 请求
1 |
|
- 响应
1 |
|
3.3 批量获取Mapping信息 GET请求
- 请求
1 |
|
- 响应
1 |
|
3.4 获取所有Mapping信息第一种方式 GET请求
- 请求
1 |
|
- 响应
1 |
|
3.5 获取所有Mapping信息第二种方式 GET请求
- 请求
1 |
|
3.6 增加Mapping字段 POST请求
- Mapping 只可增加字段
不可修改字段
- 请求
1 |
|
- 响应
1 |
|
四、文档的增删改查
4.1 新增文档 指定ID PUT/POST请求
- 请求
1 |
|
- 响应
1 |
|
4.2 新增文档 自动生成ID POST请求
- 注意: 不指定IP只能使用
POST
请求 - 注意: 自动生成ID开关要打开,关闭状态无法自动创建ID
- 请求
1 |
|
- 响应
1 |
|
4.3 自动创建索引 POST请求
- 查看auto_create_index开关状态,请求http://localhost:9200/_cluster/settings
- 注意:当索引不存在并且auto_create_index为true的时候,新增文档时会⾃动创建索引,若为false是不能自动创建索引
- 请求
1 |
|
- 响应
1 |
|
4.4 查看自动创建的索引 GET请求
- 请求
1 |
|
- 响应
1 |
|
4.5 指定操作类型
- 新增或修改的时候可能会把原有文档修改掉,这里可以指定类型
- 比如文档存在,我要新增一条文档,但是没有指定类型可能修改掉原有的文档
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
4.6 查看指定ID文档 GET请求
- 请求
1 |
|
- 响应
1 |
|
4.7 查看多条文档 第一种方式 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
4.8 查看多条文档 第二种方式 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
4.9 查看多条文档 第三种方式 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
4.10 查看多条文档 第四种方式 GET/POST请求
- 请求
1 |
|
- 响应 同上
4.11 修改文档 POST请求
- 根据提供的文档片段更新数据
- 请求
1 |
|
- 响应
1 |
|
4.12 向_source增加字段 POST请求
- 请求
1 |
|
- 响应
1 |
|
4.13 向_source删除字段 POST请求
- 请求
1 |
|
- 响应
1 |
|
4.14 更新指定文档的字段 POST请求
- 请求
1 |
|
- 响应
1 |
|
- 查询更新结果
1 |
|
- 响应
1 |
|
4.15 upsert介绍
- upsert 当指定的⽂文档不不存在时,upsert参数包含的内容将会被插⼊入到索引中,作为⼀一个新⽂文档;如果指定的⽂文档存在,ElasticSearch引擎将会执⾏行行指定的更更新逻辑
- 请求
1 |
|
- 响应
1 |
|
- 查询更新结果upsert结果
1 |
|
- 响应
1 |
|
4.16 删除文档 DELETE请求
- 请求
1 |
|
- 响应
1 |
|
五、文档的搜索
- term(词条)查询和full text(全⽂)查询
- 词条查询:词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时,才匹配搜索
- 全⽂查询:ElasticSearch引擎会先分析查询字符串,将其拆分成多个分词,只要已分析的字段中包含词条的任意⼀个,或全部包含,就匹配查询条件,返回该⽂档;如果不包含任意一个分词,表示没有任何文档匹配查询条件
5.1 单条term查询 GET/POST请求
- term 关键字查询,精确查询
- 例如SQL的where条件
- ES会对其插入的数据进行分词,当为text类型的字段时,分词后使用term查询可能查询不出,可采用精确查询。
- 请求
1 |
|
- 响应
1 |
|
5.2 多条trem查询 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
5.2 match_all查询 GET/POST请求
- 全文查询
- 请求
1 |
|
- 响应
1 |
|
5.3 match查询 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
5.4 multi_match 多个查询 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
5.4 match_phrase 多个查询 GET/POST请求
- 准确查询 类似词条查询
- 请求
1 |
|
- 响应
1 |
|
5.5 match_phrase_profix 多个查询 GET/POST请求
- 可以增加前缀
- 请求
1 |
|
- 响应
1 |
|
六、ElasticSerach 搜索
6.1 批量导入数据
- Bulkl
- ES提供了Bulk的API 来进行批量操作
- 数据结构类型,以换行区分
1 |
|
- 请求
1 |
|
- 测试 查询
1 |
|
6.2 trem多种查询
- 单词级别查询
- 这些查询通常⽤用于结构化的数据,⽐比如:number, date, keyword等,而不是对text。
- 也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上
- 去找个网站生成数据导入
1 |
|
6.2.1 term query 精准匹配查询 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
6.2.2 exsit query 在特定的字段中查找非空值的文档 GET/POST请求
- 请求
1 |
|
- 响应
1 |
|
6.2.3 prefix query 查找包含带有指定前缀term的文档 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.2.4 wildcard query 支持通配符查询 GET/POST请求
- *表示任意字符,?表示任意单个字符,类似SQL模糊查询
- 请求
1 |
|
6.2.5 regexp query 正则表达式查询 GET/POST请求
- 请求
1 |
|
6.2.6 ids query 通过id批量查询 GET/POST请求
- 请求
1 |
|
6.3 范围查询
6.3.1 第一种范围查询 GET/POST请求
- 请求
1 |
|
gt: greater than 大于
gte: greater than or equal 大于等于
lt: less than 小于
lte: less than or equal 小于等于
6.3.2 第二种范围查询 GET/POST请求
- 请求
1 |
|
6.4 布尔查询
type | description |
---|---|
must | 必须出现在匹配文档中 |
filter | 必须出现在文档中,但是不打分 |
must_not | 不能出现在文档中 |
should | 应该出现在文档中 |
6.4.1 must查询 GET/POST请求
- 请求
1 |
|
6.4.2 filter查询 GET/POST请求
- 请求
1 |
|
6.4.3 must_not查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
6.4.4 should 第一种 查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
6.4.5 should 第二种 查询 GET/POST请求
- 请求
- 请求体
1 |
|
- 响应
1 |
|
6.5 排序查询
6.5.1 第一种排序查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
6.5.2 第一种排序查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
6.6 聚合查询指标聚合
- ES聚合分析是什么
- 聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最⼤值、最⼩值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强⼤的聚合分析能力。
- 对⼀个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合
- 而关系型数据库中除了有聚合函数外,还可以对查询出的数据行分组group by,再在组上进行指标聚合。在ES中称为桶聚合
6.6.1 max min sum avg 指标聚合查询 GET/POST
- max min sum avg 指标聚合
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.2 value_count 指标聚合查询 GET/POST
- 统计非空字段的文档数
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.3 _count 指标聚合查询(严格来说不属于聚合) GET/POST
- 查询火箭队有多少文档,也就是有多少球员
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.4 cardinality 指标聚合查询 GET/POST
- Cardinality 值去重计算
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.5 status 种指标聚合查询 GET/POST
- stats 统计count max min avg sum 5个值
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.6 extended status 种指标聚合查询 GET/POST
- Extended stats ⽐比stats多4个统计结果: 平⽅方和、⽅方差、标准差、平均值加减两个标准差的区间
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.6.7 percentiles 种指标聚合查询 GET/POST
- Percentiles 占比百分位对应的值统计,默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7 聚合查询桶聚合
6.7.1 terms aggregation 桶聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.2 order 第一种分组聚合查询 GET/POST
- 请求体
1 |
|
- 响应
1 |
|
6.7.3 order 第二种分组聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.3 include 筛选分组聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.4 include 正则筛选分组聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.4 range aggregation 范围分组聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.5 date rabge aggregation 时间范围分组聚合查询 GET/POST
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
6.7.6 date histogram aggregation 时间范围分组聚合查询 GET/POST
- 按天、月、年等进行聚合统计。可按 year (1y), quarter (1q), month (1M), week (1w), day (1d), hour (1h), minute (1m), second (1s) 间隔聚合
- 请求
1 |
|
- 请求体
1 |
|
6.8 query_string 查询
- query_string 查询,如果熟悉lucene的查询语法,我们可以直接⽤用lucene查询语法写⼀一个查询串进行查询,ES中接到请求后,通过查询解析器 ,解析查询串生成对应的查询。
6.8.1 query_string AND OR 单字段查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
6.8.2 query_string AND OR 多字段查询 GET/POST请求
- 请求
1 |
|
- 请求体
1 |
|
七、ElasticSerach 高级搜索
7.1 索引别名的使用
- 在开发中,随着业务需求的迭代,较老的业务逻辑就要面临更新甚至是重构,而对于es来说,为了了适应新的业务逻辑,可能就要对原有的索引做一些修改,比如对某些字段做调整,甚至是重建索引。而做这些操作的时候,可能会对业务造成影响,甚至是停机调整等问题。由此,es提供了索引别名来解决这些问题。 索引别名就像一个快捷方式或是软连接,可以指向一个或多个索引,也可以给任意一个需要索引名的API来使⽤用。别名的应用为程序提供了极大地灵活性
7.1.1 查询别名 GET请求
- 请求
1 |
|
- 响应
1 |
|
7.1.2 新增别名 POST请求
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.1.3 删除别名 POST请求
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.1.4 重命名别名 POST请求
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.1.5 通过别名获取索引 GET请求
- 请求
1 |
|
- 响应
1 |
|
7.1.6 通过别名写索引 POST请求
- 当别名指定了一个索引,则可以做写的操作
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.2 如何重建索引
- Elasticsearch是⼀一个实时的分布式搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,在创建索引的时候需要将数据结构完整确定下来,于此同时索引的设定和很多固定配置将用不能改变。当需要改变数据结构时,就需要重新建立索引,为此,Elastic团队提供了很多辅助工具帮助开发人员进行重建索引
- 步骤
- person取一个别名person_latest, person_latest作为对外使用
- POST 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
- 新增一个索引person_20220101,结构复制于person索引,根据业务要求修改字段
- PUT 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
- 将person数据同步到person_20220101
- POST 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
- 给person_20220101添加别名person_latest,删除person别名person_latest
- POST请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
- 删除person索引
- DELETE请求
1 |
|
- 响应
1 |
|
7.3 refresh操作
- 理想的搜索
- 新的数据一添加到索引中立马就能搜索到,但是真实情况不是这样的
- 我们使⽤用链式命令请求,先添加⼀一个⽂文档,再⽴立刻搜索
1 |
|
- 强制刷新
1 |
|
- 修改默认更更新时间(默认时间是1s)
- PUT 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
- 将refresh关闭
- PUT 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.4 高亮查询
- 如果返回的结果集中很多符合条件的结果,那怎么能一眼就能看到我们想要的那个结果呢?比如,我们搜索苍井空 ,在结果集中,将所有苍井空 高亮显示?
- 请求
1 |
|
- 请求体
1 |
|
- 响应
1 |
|
7.5 查询建议
- 查询建议是什么
- 查询建议,是为了给用户提供更好的搜索体验。包括:词条检查,自动补全
- Suggester
- Term suggester
- Phrase suggester
- Completion suggester
text 指定搜索文本 field 获取建议词的搜索字段 analyzer 指定分词器 size 每个词返回的最大建议词数 sort 如何对建议词进行排序,可用选项:score:先按评分排序、再按文档频率排、term顺序;frequency:先按文档频率排,再按评分、term顺序排。 suggest_mode 建议模式,控制提供建议词的方式:missing:仅在搜索的词项在索引中不存在时才提供建议词,默认值;popular:仅建议文档频率比搜索词项高的词;always:总是提供匹配的建议词
7.5.1 term suggester
- term 词条建议器 ,对给输入的文本进行分词,为每个分词提供词项建议
- 请求
1 |
|
- 请求体
1 |
|
7.5.2 phrase suggester
- phrase 短语建议,在term的基础上,会考量多个term之间的关系,比如是否同时出现在索引的原文⾥里,相邻程度,以及词频等
- 请求
1 |
|
- 请求体
1 |
|
7.5.3 completion suggester
- Completion 完成建议
- 请求
1 |
|
- 请求体
1 |
|
八、person中国官网实战
- 官方网站
https://china.person.com/playerindex/
8.1 项目搭建
- springboot 整合 elasticsearch 和 mysql
8.1.1 POM依赖
1 |
|
8.1.2 YML依赖
1 |
|
8.1.3 ElasticSearch配置文件
1 |
|
8.1.4 ElasticSearch CRUD入门操作
- 对象转Map工具类
1 |
|
- CRUD 实现方法
1 |
|
- CRUD 测试类
1 |
|
8.2 接口开发
- Result结果集Vo
1 |
|
- 结果集对应的枚举
1 |
|
8.2.1 将数据库数据导入到elastic search
- controller层
1 |
|
- service层
1 |
|
8.2.2 通过姓名查找球员
- controller层
1 |
|
- service层
1 |
|
8.2.3 通过国家或者球队查询球员
- controller层
1 |
|
- service层
1 |
|
8.2.4 通过姓名字母查找球员
- controller层
1 |
|
- service层
1 |
|
中间件篇-ElasticSearch7.x教程
https://mikeygithub.github.io/2021/03/30/yuque/中间件篇-ElasticSearch7.x教程/