1、理解

支持全文检索,提供Restful风格API,使用DSL语法操作。
是ELK中的一部分

E:ES、数据存储检索 L:Logstash、日志采集 K:Kibana、可视化操作页面

2、倒排索引

一条数据就是一个文档,文档保存建立索引时,先进行分词,提取出词条和文档ID生成索引,词条不能重复,每个词条可对应多个ID。

与数据库的索引区别的地方在于,数据库使用的是正向索引,根据主键排序生成索引。查询时,先找到主键索引再去对比数据。而ES在查询时,是先分词,查找对应词条再拿到文档ID获取结果,顺序颠倒,所以叫倒排索引。

3、分词器(analyze)

文档对应字段分词得出词条,是基于分词器实现的,

3.1、IK分词器

ES默认分词器 standard,对中文分词不是很理想,所以需要一个支持中文语义的分词器。
IK分词器有两种模式:
ik-smart:智能切分,粗粒度
ik-max-word:最细切分,细粒度

3.2、拼音分词器

3.3、词典

词典配置文件:IKAnalyzer.cfg.xml
虽然有中文专用分词器,但是对于一些最新的网络热词,现代词语还是不能支持,这种场景就需要使用词典。
词典可设置扩展词,也可设置禁用词。
扩展词:将分词器不能识别的新兴词语设置成扩展词,分词器就可以识别。
禁用词:一些比较忌讳的或者违规的词语就可以设置成禁用词,表示分词器可以忽略这些词语不要分成词条。

4、索引库(类似数据库表)

索引库创建完成后不支持修改,可以新增字段代替要修改的字段。支持增、删、查。使用restful风格接口。

5、文档映射关系Mapping(类似数据库表结构)

  1. type:字段数据类型,有以下几种:
    1. 字符串:text 可分词索引字符串、Keyword 不分词索引字符串(精确查询)
    2. 数值
    3. 布尔类型:boolean
    4. 日期:Date
    5. 对象:Object
  2. index:是否创建索引,默认为True,即根据类型创建索引
  3. analyzer:指定分词索引使用的分词器
  4. properties:字段的子字段

    建议对要查询的字段设置cpoy_to_all,就会有一个隐藏字段ALL,包含所有字段值

6、文档(类似数据库行数据)

使用restful接口,使用DSL语法

  • 增加POST/索引库/_doc/文档id

    注:ID如果未指定id,则自动生成id

  • 查询GET /索引库/_doc/文档id

  • 删除DELETE /索引库/_doc/文档id
  • 全量修改PUT /索引库/_doc/文档id

    • 注:先删后增
  • 局部修改、增量修改POST /索引库/_update/文档id

    • 注:修改操作会使文档的version+1

7、RestClent-ES操作客户端

8、DSL查询语法 Domain-Specific-Language

基于JSON格式的语法操作ES

8.1、查询所有

match_all 无条件查询

8.2、全文检索

match单字段条件查询
multi_match多字段条件查询

8.3、精确查询

term根据词条精确查询,查询的字段是要不分词的
range范围查询,gte:大于等于、gt:大于,lte:小于等于、lt:小于

8.4、地理查询

矩形查询需要指定左上右下角两个坐标,然后组成矩形,坐标在矩形范围内的符合条件
附近查询需要指定原点和半径,以原点和半径画圆,坐标在圆内的符合条件

8.5、复合查询

1、query score 相关性算分、原始算分

根据搜索结果和搜索条件的关联度评分,按分数降序排列。

ES5.1版本后使用BM25算法

2、function score 算分函数查询

三要素: 1、过滤条件:符合过滤条件的才会参与重新算分
2、算分函数:根据指定计算方式重新算分得出新分数
3、加权模式:指定原始算分和算分函数的计算方式
计算过程:1、原始查询算分,得出原始分数
2、过滤条件过滤原始结果,得出需要重新算分的结果
3、指定算分函数需要使用的计算方式
4、将原始算分和算分函数重新计算得出函数算分,作为相关性算分倒序排序

3、Boolean query 布尔查询

一个或者多个查询字句的结合查询,每一个字句就是一个子查询
must 必须匹配每个子查询,数据库的and
should选择性匹配子查询,or
must_not必须不匹配,不参与算分,!=
filter必须匹配,不参与算分

注意:提高性能就尽量不要参与算分,参与算分的字段越多,性能就越低

9、ES查询结果处理

9.1、排序

排序条件是数组结构,可以指定多个排序条件,按照声明的顺序依次对结果排序
1、普通字段排序:sort
2、地理排序:按照结果与原点的距离排序,需要指定一个原点,计算目标与原点之间的距离

9.2、分页

简单分页:form,size:从哪开始,查询条数,类似数据库 limit ?,?
深度分页:search_after

ES官方禁止查询一万条以上的数据

9.3、高亮显示 highlight

实现方式:1、匹配文档的关键字增加一个标签<em></em>标签
2、页面给相应标签增加样式

关键字高亮,所以搜索条件中必须带有关键字,而且不能是范围查询,高亮的字段必须和搜索条件的字段一致,否则无法高亮。如果对非搜索字段高亮,如查询ALL字段(copy_to_all)需要增加设置才可以高亮:require_filed_match=false