优势
- 使用门槛低、开发周期短、上线快
- 性能好、查询快、实时展示结果
- 扩容方便、快速支撑增长迅速的数据
elastic stack
- kibana
- elasticsearch
- logstash
- beats
常见术语
- 节点:一个elasticsearch 实例、是集群的构成单位
- Cluster:由一个或多个节点构成、对外提供服务
- Document:Json对象、由字段Field组成、常见的数据类型如下
- 字符串:text、keyword
- 数值型:long、integer、short、byte、double、float........
- 布尔:boolean
- 日期:date
- 二进制:binary
- 范围类型:integer_range,float_range,long_range,date_range,double_range
- 每个document都有一个唯一的id标识
- 自行指定
- es自动生成
- document metaData
- _index:文档所在的索引名
- _type:文档所在的类型名(6.x废弃,默认都是doc)
- _id:文档的唯一id
- _uid:组合id、由_type和id组成(6.x之后_type不再起作用、等同于_id)
- _source:文档的原始json数据、可以从这里获取每个字段的内容
- _all:整合所有字段内容到该字段、默认禁用、耗时长、并且不常用
- Index:索引中存储具有相同结构的文档(Document)
- 每个索引都有自己的mapping定义、用于定义字段名和类型
- 一个集群可以有多个索引
- 正排索引:文档Id到文档内容、单词的关联关系(mysql索引)
- 倒排索引:单词到文档id的关联关系、每个字段都有自己独立的倒排索引、倒排索引包含以下两部分
- 单词词典 Term Dictionary
- 记录了所有文档的单词、一般都比较大
- 记录了单纯到倒排列表的关联信息
- 倒排列表 Posting List 记录了单词对应的文档的集合、由倒排索引项组成
- 文档id、用于获取原始信息
- 单词频率TF(Term Frequency)、记录改单词在该文档中出项的次数、用于后续的相关性算分
- 位置Position 记录单纯在文档中的分词位置 多个,用于做词语搜索 Phrase Query
- 偏移Offset 记录单词在文档的开始和结束位置、用于做高亮显示
- 单词词典 Term Dictionary
常用API
创建索引
![](https://img.haomeiwen.com/i2038754/3b6a0bcda3d40691.png)
创建文档
![](https://img.haomeiwen.com/i2038754/7e89f6d91c01e41f.png)
![](https://img.haomeiwen.com/i2038754/7b2ce261a714cd5d.png)
查询文档
![](https://img.haomeiwen.com/i2038754/075ef7e4c0adfb56.png)
![](https://img.haomeiwen.com/i2038754/f9a79c1e19482312.png)
批量创建文档
![](https://img.haomeiwen.com/i2038754/ee9b2dccc80a2246.png)
批量查询文档
![](https://img.haomeiwen.com/i2038754/972b30d5359a2757.png)
倒排索引查询过程
![](https://img.haomeiwen.com/i2038754/9b94afb2ac9d4b26.png)
查询包含“搜索引擎”的文档
- 通过查询倒排索引获得“搜索引擎”对应的文档Id有1和3
- 通过正排索引查询1 和 3 的完整内容
- 返回用户最终结果
分词
分词是将文本转成一系列单词(term or token)的过程、也可以叫做文本分析、es里面称为Analysis
分词器
分词器是es 专门处理分词的组件、英文为Analyzer,由以下组成
- character filters 针对原始文本进行处理、比如去除html特殊标记符
- tokenizer 将原始文本按照一定规则切分为单词
- token filters 针对tokenizer 处理的单词进行再加工、比如小写、删除或新增等处理
es提供了一个测试分词的api接口、方便验证分词的效果、endpoint是_analyze
- 可以直接指定analyzer进行测试
- 可以直接指定索引中的字段进行测试
- 可以自定义分词器进行测试
![](https://img.haomeiwen.com/i2038754/5f3c41dfac051676.png)
![](https://img.haomeiwen.com/i2038754/c561bb7dcc2ffc6c.png)
分词的使用说明
分词会在以下两个时机使用
- 创建或更新文档时、会对相应的文档进行分词处理
- 查询时、会对查询语句进行分词
Mapping
类似数据库中的表结构定义、主要作用如下:
- 定义Index下的字段名 field name
- 定义字段的类型、比如数值型、字符串型、布尔型
- 定义倒排索引相关的配置、比如是否索引、记录position等
Mapping中的字段类型一旦设定之后、禁止直接修改、原因如下
Lucene实现的倒排索引生成后不允许修改
但是允许新增字段
可以通过设置dynamic参数控制字段的新增
- true默认值、运行自动新增字段
- false不允许新增字段、但是文档可以正常写入、但是无法对字段进行查询等操作
- strict 文档不能写入、直接报错
copy_to属性
将该字段的值复制到目标字段、实现类似_all的作用、但是这个字段不会出现在_source中、只能用来搜索
![](https://img.haomeiwen.com/i2038754/dfdbe8cfdb50e1b4.png)
![](https://img.haomeiwen.com/i2038754/7efc840091f69df0.png)
index和index_optoins 属性
index 属性 控制当前字段是否索引、默认为true、即记录索引、false不记录、即不可搜索
index_options 用于控制倒排索引记录的内容、有如下四种配置
- docs 只记录doc id
- freqs 记录doc id 和 term frequencies
- positions 记录doc id 、term frequencies 和term position
- offset 记录doc id term frequencies term position 和character offsets
text类型默认配置是position 其他默认为docs
记录内容越多、占用空间越大
null_value
当字段类型遇到null值得处理策略默认为null此时es回忽略该值、可以通过设定该值设定字段的默认值
![](https://img.haomeiwen.com/i2038754/a8068f4425965572.png)
网友评论