引言
说起es,大家都知道把数据放在es中,他的查询速度很快,能用最短时间模糊匹配到对应的数据。那这里就需要从他的倒排索引说起。
倒排索引
他的结构如下:
分词 | 文档id | 词频 | 位置 | 偏移 |
---|---|---|---|---|
我 | 1 | 3 | 0,54,111 | <0-1>,<54-55>,<111-112> |
是 | 1 | 4 | 1,21,35,57 | <1-2>,<21-22>,<35-36>,<57-58> |
中国 | 1 | 2 | 2,44 | <2-4>,<44-46> |
人 | 1 | 3 | 4,67,88 | <4-5>,<67-68>,<88-89> |
名词解释
- 单词(Term):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term。
- 单词词典(Term Dictionary):它里面维护的是Term,可以理解为Term的集合。
- 单词索引(Term Index):为了更快的找到某个单词,我们为单词建立索引。
- 倒排列表(Posting List):倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。(PS:实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,可以想象成是Python中的元组,或者Java中的对象)。
- 文档 id(DocId, Document Id),包含单词的所有文档唯一 id,用于去正排索引中查询原始数据。
- 词频(TF,Term Frequency),记录 Term 在每篇文档中出现的次数,用于后续相关性算分。
- 位置(Position),记录 Term 在每篇文档中的分词位置(多个),用于做词语搜索(Phrase Query)。
- 偏移(Offset),记录 Term 在每篇文档的开始和结束位置,用于高亮显示等。
存储时候会把文档内存进行分词处理,例如我们要存储内容为“我是中国人”,那么分词后就是“我”,“是”,“中国”,“人”,“中国人”。
分词后这些单词会去单词词典检查是否存在,如果不存在则创建,并添加在单词索引中,倒排列表中添加文档相关信息(文档id,词频,位置,偏移),如果存在则去倒排列表中查找,然后追加倒排列表需要记录的信息(文档id,词频,位置,偏移)。
当一个查询过来时候,一样会走分词器,分词后,每个单词去单词词典检查一次,把单词词典的结果放在单词索引中查询,然后找到对应的倒排列表,在倒排列表中检索,找到对应的文档。
正向索引
正向索引就是通过文档id检索内容。
分词器
es的内置分词器
- Standard Analyzer:默认分词器,按词切分,小写处理
- Simple Analyzer:按照非字母切分(符号被过滤),小写处理
- Stop Analyzer:停用词过滤(the,a,is),小写处理
- Whitespace Analyzer:按照空格切分,不转小写
- Keyword Analyzer:直接将输入当做输出,不分词
- Patter Analyzer:正则表达式,默认 \W+(非字符分割)
- Language:提供了30多种常见语言的分词器
但es内置的分词器都不是很实用于中文,比如实用默认的standard,中文分词会出现的就是一个字一个字的被拆分,没办法形成词。
中文分词器(IK Analyzer)
IKAnalyzer是一个开源的、基于java开发的轻量级中文分词工具包。
可以通过下面这命令进行安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
使用IK分词器
IK分词器有两种分词模式:ik_max_word和ik_smart模式
- ik_max_word模式会对文本进行最细粒度的拆分, 比如“我是中国人”为“我”、“”是、“中国”、“人”、“中国人”。
- ik_smart模式是粗粒度的,比如“我是中国人”为“我”、“”是、“中国”、“人”。
聚合查询
聚合查询分为:桶聚合(Bucket aggregations)、指标聚合(Metrics aggregations)、管道聚合(Pipeline aggregations)
语法
GET testes/_search { "aggs": { "<aggs_name>": { "<agg_type>": { "field": "<field_name>" } } } }
aggs_name:聚合函数的名称
agg_type:聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)
field_name:字段名称或者叫域名。
桶聚合(Bucket aggregations)
- 类比SQL中的group by的作用,主要用于统计不同类型数据的数量
- 函数:terms
指标聚合(Metrics aggregations)
- 主要用于最大值、最小值、平均值、字段之和等指标的统计
- 函数:平均值:Avg、最大值:Max、最小值:Min、求和:Sum、详细信息:Stats、数量:Value count
管道聚合(Pipeline aggregations)
- 用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值
- 函数:Min bucket:最小桶、Max bucket:最大桶、Avg bucket:桶平均值、Sum bucket:桶求和、Stats bucket:桶信息
sql支持
X-Pack
Elasticsearch SQL是一个X-Pack组件
1)5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。
2)5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pack。
3)6.3 版本之前:需要额外安装。
4)6.3版本及之后:已经集成在一起发布,无需额外安装,基础安全属于付费黄金版内容。
5)6.8.0和7 .1版本:基础安全免费。
安装
和ik的插件安装方式差不多,stop es之后,进入es目录,执行命令
./bin/elasticsearch-plugin install https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.2.0.zip