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(类似数据库表结构)
- type:字段数据类型,有以下几种:
- 字符串:text 可分词索引字符串、Keyword 不分词索引字符串(精确查询)
- 数值
- 布尔类型:boolean
- 日期:Date
- 对象:Object
- index:是否创建索引,默认为True,即根据类型创建索引
- analyzer:指定分词索引使用的分词器
- 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
8.1、查询所有
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
必须匹配每个子查询,数据库的andshould
选择性匹配子查询,ormust_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