1. 相关概念
1.1 关系型数据库搜索问题
- 将文档逐个编号,存储到文档列表中,给每个编号创建索引
- 如果要根据字段查询,会将该字段内容进行分词,产生词汇表
- 词汇表中的每个词汇,会关联文档ID
- 查询时,将查询的条件内容拆分成词汇,去词汇表中匹配
- 根据匹配到词汇,得到关联的ID
- 去文档列表中 根据ID获取文档
根据要检索的内容,创建词汇表,查询时,先查询词汇表,根据关键词得到对应的内容
1.3 Lucene
基于java开发的开源的搜索引擎API 基于倒排索引实现
1.4 ES背景介绍
ES的介绍
基于Lucene引擎实现的搜索产品 web服务
ES的特点
- 速度快,海量数据近实时搜索
- 扩展性高
- 强大的查询和分析
-
1.5 ES核心概念
索引库(index indices)
- 文档(document)
- 映射(Mapping)
- 集群Cluster 和 节点Node
- 分片(Shards)和副本(replicas)
1.6 ES和Mysql的参照理解
2. ES和kibana的安装和启动
windows安装
Es的安装和启动
1.解压
2.配置
config/elasticsearch.yml
3.启动
bin/elasticsearch.bat
kibana的安装和启动
1 解压
2 配置
config/kibana.yml
3 启动
bin/kibana.bat
配置IK分词器
作用
用于支持友好的中文分词
分词类型
ik_smart
劳动人民 最光荣
ik_max_word
劳动人民 劳动 人民 动人 最 光荣
扩展
通过停用词词典 标记分词忽略的词
通过扩展词词典 让分词器知道更多的词语
3. ES的操作-索引库CRUD
- 创建索引库 PUT 索引库
- 查询索引库: GET 索引库
- 删除索引库 DELETE 索引库
4. ES的操作-映射的操作
4.1 创建索引库时设置映射
put /索引库4.2 创建索引库后设置映射
put /索引库/_mappings4.3 查看映射
GET 索引库/_mapping5. ES的操作-文档的搜索
5.1 语法
GET /索引库名称/_search
5.2 搜索参数:
query查询条件
- match_all 查询全部
- match 分词查询
- term 关键词查询
- ange 范围查询 lt 小于 lte 小于等于 gt 大于 gte 大于等于
- fuzzy 相似度查询偏差值: 0 1 2
- bool 布尔查询
1.must必须满足的条件
2.must_not必须不满足的条件
3.should应该满足的条件
4.filter过滤条件
sort排序设置
默认按照: score
不能使用分词字段
分页设置
from 起始条数
size 每页条数
from+size > 10000条 有深度分页的问题
highlight设置
设置高亮字段
设置高亮的前置标签 preTags
设置高亮的后置标签 postTags
聚合查询
桶聚合
terms按照关键词分组
度量聚合
avg求平均值
max求最大值
min求最小值
sum求和
stats同时返回avg、max、min、sum、count等
6. 使用原生client操作es
创建ES客户端对象
RestHighLevelClient
创建索引库及映射
1. 创建CreateIndexRequest对象,并指定索引库名称<br /> 2. 指定settings配置<br /> 3. 指定mapping配置<br /> 4. 发起请求,得到响应
文档的操作
文档添加
1. 准备文档数据<br /> 2. 创建IndexRequest对象,并指定索引库名称<br /> 3. 指定新增的数据的id<br /> 4. 将新增的文档数据变成JSON格式<br /> 5. 将JSON数据添加到IndexRequest中<br /> 6. 发起请求,得到结果
文档查询
1. 创建GetRequest 对象,并指定索引库名称、文档ID<br /> 2. 发起请求,得到结果<br /> 3. 从结果中得到source,是json字符串<br /> 4. 将JSON反序列化为对象
文档删除
1. 创建DeleteRequest对象,指定索引库名称、文档ID<br /> 2. 发起请求
批处理请求
1. 从数据库查询文档数据<br /> 2. 创建BulkRequest对象<br /> 3. 创建多个IndexRequest对象,组织文档数据,并添加到BulkRequest中<br /> 4. 发起请求
文档的查询
查询全部
分词查询
QueryBuilders.matchQuery(“note”, “唱歌 javaee”)
布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
添加term : boolQuery.must(QueryBuilders.termQuery(“city”, “杭州”));
添加range : boolQuery.filter(QueryBuilders.rangeQuery(“price”).lte(250));
分页和排序
起点: SearchSourceBuilder.from((page - 1) * size)
每页条数 SearchSourceBuilder.size(size)
高亮
request.source().highlighter(new HighlightBuilder().field(“name”).requireFieldMatch(false));
聚合:
搜索思路
- 创建SearchSourceBuilder对象
- 添加查询条件QueryBuilders
- 如:添加排序、分页等其它条件
- 创建SearchRequest对象,并制定索引库名称
- 添加SearchSourceBuilder对象到SearchRequest对象source中
- 发起请求,得到结果
解析结果SearchResponse
1. 获取总条数<br /> 2. 获取SearchHits数组,并遍历<br /> - 获取其中的`_source`,是JSON数据<br /> - 把`_source`反序列化为User对象