7.1相关概念
1.搜索技术的应用场景
综合搜索网站:百度、谷歌等<br /> 电商网站:京东、淘宝的商品搜索<br /> 资讯网站: 微博、头条、小说<br /> 站内搜索<br /> 搜索无处不在
2.倒排索引
2.1关系型数据库搜索问题
数据量大时,性能严重下降<br /> 无法应对复杂的业务查询<br /> 难以应对高并发场景<br /> 模糊查询时索引会失效
2.2倒排索引的工作原理
1.将文档逐个编号,存储到文档列表中,给每个编号创建索引<br /> 2.如果要根据字段查询,会将该字段内容进行分词,产生词汇表<br /> 3.词汇表中的每个词汇,会关联文档ID<br /> 4.查询时,将查询的条件内容拆分成词汇,去词汇表中匹配<br /> 5.根据匹配到词汇,得到关联的ID<br /> 6.去文档列表中 根据ID获取文档
2.3一句话介绍倒排索引
根据要检索的内容,创建词汇表,查询时 先查询词汇表,根据关键词得到对应的内容
2.4Lucene的介绍
基于java开发的开源的搜索引擎API<br /> 基于倒排索引实现
3.ES背景介绍
3.1ES的介绍
基于Lucene引擎实现的搜索产品<br /> web服务
3.2ES的特点
速度快,海量数据近实时搜索<br /> 扩展性高<br /> 强大的查询和分析<br /> 操作简单
4.ES核心概念
索引库(index indices)<br /> 文档(document)<br /> 映射(Mapping)<br /> 集群Cluster 和 节点Node<br /> 分片(Shards)和副本(replicas)
5.ES和Mysql的参照理解
| MySQL |
Elasticsearch |
说明 |
| Table |
Index |
索引(index),就是文档的集合,类似数据库的表(table) |
| Row |
Document |
文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
| Column |
Field |
字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
| Schema |
Mapping |
Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
| SQL |
DSL |
DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
7.2ES和kibana的安装和启动
1.windows安装
1.1es的安装和启动
1 解压<br /> 2 配置<br /> config/elasticsearch.yml<br /> 3 启动<br /> bin/elasticsearch.bat
1.2kibana的安装和启动
1 解压<br /> 2 配置<br /> config/kibana.yml<br /> 3 启动<br /> bin/kibana.bat
2.docker安装
es的安装和启动<br /> kibana的安装和启动
3.配置IK分词器
作用<br /> 用于支持友好的中文分词<br /> 分词类型<br /> ik_smart<br /> 劳动人民 最光荣<br /> ik_max_word<br /> 劳动人民 劳动 人民 动人 最 光荣<br /> 扩展<br /> 通过停用词词典 标记分词忽略的词<br /> 通过扩展词词典 让分词器知道更多的词语
7.3ES的操作-索引库CRUD
创建索引库<br /> PUT 索引库<br /> 查询索引库:<br /> GET 索引库<br /> 删除索引库<br /> DELETE 索引库
7.4ES的操作-映射的操作
1.创建索引库时设置映射
PUT /heima
{
"mappings":{
"properties":{
"title":{
"type":"text",
"analyzer":"ik_smart"
},
"images":{
"type":"keyword",
"index":"false"
},
"desc":{
"type":"text",
"analyzer":"ik_smart"
},
"price":{
"type":"float"
}
}
}
}
2.创建索引库后设置映射:
PUT /heima/_mappings
{
"properties":{
"title":{
"type":"text",
"analyzer":"ik_smart"
},
"images":{
"type":"keyword",
"index":"false"
},
"price":{
"type":"float"
}
}
}
3.查看映射
GET 索引库/_mapping
4.映射的属性说明
type 字段类型<br /> 1) 字符串类型<br /> text: 会对存储的内容进行分词<br /> keyword: 不会分词<br /> 2)数值类型<br /> long、integer、short byte double float scaled_float <br /> 3)日期类型<br /> date <br /> 4)对象类型<br /> object<br /> 5)对象数组类型<br /> nested<br /> index 是否索引<br /> analyzer 分词器<br /> properties 子属性
7.5ES的操作-文档CRUD
1.添加文档
POST 索引库/_doc/id
2.根据ID查看文档
GET 索引库/_doc/id<br /> _source字段存储文档内容
3.根据ID修改文档
PUT 索引库/_doc/id<br /> POST 索引库/_update/id
4.根据ID删除文档
DELETE 索引库/_doc/id
7.6ES的操作-文档的搜索
1.语法: GET /索引库名称/_search
2.搜索参数:
2.1query查询条件
match_all 查询全部<br /> match 分词查询<br /> term 关键词查询<br /> range 范围查询<br /> lt 小于 lte 小于等于 gt 大于 gte 大于等于<br /> fuzzy 相似度查询<br /> 偏差值: 0 1 2<br /> bool 布尔查询<br /> must<br /> 必须满足的条件<br /> must_not<br /> 必须不满足的条件<br /> should<br /> 应该满足的条件<br /> filter<br /> 过滤条件<br /> sort排序设置<br /> 默认按照: score <br /> 不能使用分词字段<br /> 分页设置<br /> from<br /> size<br /> from+size > 10000条 有深度分页的问题 <br /> highlight设置<br /> 设置高亮字段<br /> 设置高亮的前置标签<br /> 设置高亮的后置标签<br /> 聚合查询<br /> 桶聚合<br /> terms<br /> 按照关键词分组<br /> 度量聚合<br /> avg<br /> 求平均值<br /> max<br /> 求最大值<br /> min<br /> 求最小值<br /> sum<br /> 求和<br /> stats<br /> 同时返回avg、max、min、sum、count等
7.7使用原生client操作es
1.创建ES客户端对象
RestHighLevelClient
2.创建索引库及映射
1. 创建CreateIndexRequest对象,并指定索引库名称<br /> 2. 指定settings配置<br /> 3. 指定mapping配置<br /> 4. 发起请求,得到响应
3.文档的操作
3.1文档添加
1. 准备文档数据<br /> 2. 创建IndexRequest对象,并指定索引库名称<br /> 3. 指定新增的数据的id<br /> 4. 将新增的文档数据变成JSON格式<br /> 5. 将JSON数据添加到IndexRequest中<br /> 6. 发起请求,得到结果
3.2文档查询
1. 创建GetRequest 对象,并指定索引库名称、文档ID<br /> 2. 发起请求,得到结果<br /> 3. 从结果中得到source,是json字符串<br /> 4. 将JSON反序列化为对象
3.3文档删除
1. 创建DeleteRequest对象,指定索引库名称、文档ID<br /> 2. 发起请求
3.4批处理请求
1. 从数据库查询文档数据<br /> 2. 创建BulkRequest对象<br /> 3. 创建多个IndexRequest对象,组织文档数据,并添加到BulkRequest中<br /> 4. 发起请求
4.文档的查询
4.1查询全部
QueryBuilders.matchAllQuery()
4.2分词查询
QueryBuilders.matchQuery("note", "唱歌 javaee")<br /> 布尔查询<br /> 分页和排序<br /> 高亮<br /> 聚合:
4.7搜索思路
1. 创建SearchSourceBuilder对象<br /> 1. 添加查询条件QueryBuilders<br /> 2. 如:添加排序、分页等其它条件<br /> 2. 创建SearchRequest对象,并制定索引库名称<br /> 3. 添加SearchSourceBuilder对象到SearchRequest对象source中<br /> 4. 发起请求,得到结果<br /> 5. 解析结果SearchResponse<br /> 1. 获取总条数<br /> 2. 获取SearchHits数组,并遍历<br /> - 获取其中的`_source`,是JSON数据<br /> - 把`_source`反序列化为User对象
7.8ES的集群管理
1.单点ES的问题
- 单台机器存储容量有限<br /> - 单服务器容易出现单点故障,无法实现高可用<br /> - 单服务的并发处理能力有限
2.集群和分布式
- 集群和分布式:<br /> - 集群:多个人做一样的事。<br /> - 分布式:多个人做不一样的事<br /> - 集群解决的问题<br /> 让系统高可用<br /> 分担请求压力<br /> - 分布式解决的问题<br /> 分担存储和计算的压力,提速<br /> 解耦
3.ES集群的概念
ES天生的分布式集群架构<br /> 相关概念<br /> - 集群(cluster):一组拥有共同的 cluster name 的 节点。<br /> - 节点(node :集群中的一个 Elasticearch 实例<br /> - 索引(index) :es存储数据的地方。相当于关系数据库中的database概念<br /> - 分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中<br /> - 主分片(Primary shard):相对于副本分片的定义。<br /> - 副本分片(Replica shard)每个主分片可以有一个或者多个副本,数据和主分片一样。
4.ES集群搭建
1.基于docker搭建集群<br /> 2.Kibana访问集群<br /> 3.测试集群<br /> 3.1创建索引库并设置分片<br /> <br /> 3.2分片与自平衡<br /> 当节点挂掉后,挂掉的节点分片会自平衡到其他节点中<br /> 注意:分片数量一旦确定好,不能修改。
5.路由原理
文档存入对应的分片,ES计算分片编号的过程,称为路由。<br /> 路由算法 :**shard_index = hash(id) % number_of_primary_shards**
6.集群脑裂现象
**脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。**<br /> 脑裂产生的原因<br /> - 网络原因:网络延迟<br /> - 主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应<br /> - 当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应。<br /> 避免脑裂<br /> - 网络原因:`discovery.zen.ping.timeout` 超时时间配置大一点。默认是3S<br /> <br /> - 修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的内存一半。