1. 相关概念

1.1 关系型数据库搜索问题

  • 数据量大时,性能严重下降
  • 无法应对复杂的业务查询
  • 难以应对高并发场景
  • 模糊查询时索引会失效

    1.2 倒排索引的工作原理

  1. 将文档逐个编号,存储到文档列表中,给每个编号创建索引
  2. 如果要根据字段查询,会将该字段内容进行分词,产生词汇表
  3. 词汇表中的每个词汇,会关联文档ID
  4. 查询时,将查询的条件内容拆分成词汇,去词汇表中匹配
  5. 根据匹配到词汇,得到关联的ID
  6. 去文档列表中 根据ID获取文档

    根据要检索的内容,创建词汇表,查询时,先查询词汇表,根据关键词得到对应的内容

1.3 Lucene

基于java开发的开源的搜索引擎API 基于倒排索引实现

1.4 ES背景介绍

  1. ES的介绍

    基于Lucene引擎实现的搜索产品 web服务

  2. ES的特点

  • 速度快,海量数据近实时搜索
  • 扩展性高
  • 强大的查询和分析
  • 操作简单

    1.5 ES核心概念

  • 索引库(index indices)

  • 文档(document)
  • 映射(Mapping)
  • 集群Cluster 和 节点Node
  • 分片(Shards)和副本(replicas)

    1.6 ES和Mysql的参照理解

    image.png

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 /索引库/_mappings

    4.3 查看映射

    GET 索引库/_mapping

    5. 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客户端对象

  1. RestHighLevelClient

创建索引库及映射

  1. 1. 创建CreateIndexRequest对象,并指定索引库名称<br /> 2. 指定settings配置<br /> 3. 指定mapping配置<br /> 4. 发起请求,得到响应

文档的操作

文档添加

  1. 1. 准备文档数据<br /> 2. 创建IndexRequest对象,并指定索引库名称<br /> 3. 指定新增的数据的id<br /> 4. 将新增的文档数据变成JSON格式<br /> 5. JSON数据添加到IndexRequest中<br /> 6. 发起请求,得到结果

文档查询

  1. 1. 创建GetRequest 对象,并指定索引库名称、文档ID<br /> 2. 发起请求,得到结果<br /> 3. 从结果中得到source,是json字符串<br /> 4. JSON反序列化为对象

文档删除

  1. 1. 创建DeleteRequest对象,指定索引库名称、文档ID<br /> 2. 发起请求

批处理请求

  1. 1. 从数据库查询文档数据<br /> 2. 创建BulkRequest对象<br /> 3. 创建多个IndexRequest对象,组织文档数据,并添加到BulkRequest中<br /> 4. 发起请求

文档的查询

查询全部

QueryBuilders.matchAllQuery()

分词查询

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));

聚合:

搜索思路

  1. 创建SearchSourceBuilder对象
  2. 添加查询条件QueryBuilders
  3. 如:添加排序、分页等其它条件
  4. 创建SearchRequest对象,并制定索引库名称
  5. 添加SearchSourceBuilder对象到SearchRequest对象source中
  6. 发起请求,得到结果
  7. 解析结果SearchResponse

    1. 1. 获取总条数<br /> 2. 获取SearchHits数组,并遍历<br /> - 获取其中的`_source`,是JSON数据<br /> - `_source`反序列化为User对象