ES:倒排索引、分词详解(02-28 - 03-04)

一,倒排索引(Inverted Index)
ElasticSearch引擎把文档数据写入到倒排索引(Inverted Index)的数据结构中,倒排索引建立的是分词(Term)和文档(Document)之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的。

一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表
示例:
对以下三个文档去除停用词后构造倒排索引

倒排索引-查询过程

查询包含“搜索引擎”的文档

通过倒排索引获得“搜索引擎”对应的文档id列表,有1,3
通过正排索引查询1和3的完整内容
返回最终结果
倒排索引-组成

单词词典(Term Dictionary)
倒排列表(Posting List)
单词词典(Term Dictionary)
单词词典的实现一般用B+树,B+树构造的可视化过程网址:B+ Tree Visualization


倒排列表(Posting List)

倒排列表记录了单词对应的文档集合,有倒排索引项(Posting)组成
倒排索引项主要包含如下信息:
1.文档id用于获取原始信息
2.单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分
3.位置(Posting),记录单词在文档中的分词位置(多个),用于做词语搜索(Phrase Query)
4.偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示

B+树内部结点存索引,叶子结点存数据,这里的 单词词典就是B+树索引,倒排列表就是数据,整合在一起后如下所示

ES存储的是一个JSON格式的文档,其中包含多个字段,每个字段会有自己的倒排索引

倒排索引的结构

包含这个关键词的document list
包含这个关键词的所有document的数量:IDF(inverse document frequency)
这个关键词在每个document中出现的次数:TF(term frequency)
这个关键词在这个document中的次序
每个document的长度:length norm
包含这个关键词的所有document的平均长度
倒排索引不可变的好处

不需要锁,提升并发能力,避免锁的问题
数据不变,一直保存在os cache中,只要cache内存足够
filter cache一直驻留在内存,因为数据不变
可以压缩,节省cpu和io开销
二,分词
分词是将文本转换成一系列单词(Term or Token)的过程,也可以叫文本分析,在ES里面称为Analysis

分词器
分词器是ES中专门处理分词的组件,英文为Analyzer,它的组成如下:

Character Filters:针对原始文本进行处理,比如去除html标签
Tokenizer:将原始文本按照一定规则切分为单词
Token Filters:针对Tokenizer处理的单词进行再加工,比如转小写、删除或增新等处理
分词器调用顺序


Analyze API


预定义的分词器

Standard Analyzer
默认分词器
按词切分,支持多语言
小写处理
Simple Analyzer
按照非字母切分
小写处理
Whitespace Analyzer
空白字符作为分隔符
Stop Analyzer
相比Simple Analyzer多了去除请用词处理
停用词指语气助词等修饰性词语,如the, an, 的, 这等
Keyword Analyzer
不分词,直接将输入作为一个单词输出
Pattern Analyzer
通过正则表达式自定义分隔符
默认是\W+,即非字词的符号作为分隔符
Language Analyzer
提供了30+种常见语言的分词器
三,自定义分词
Character Filters

在Tokenizer之前对原始文本进行处理,比如增加、删除或替换字符等
自带的如下:
1.HTML Strip Character Filter:去除HTML标签和转换HTML实体
2.Mapping Character Filter:进行字符替换操作
3.Pattern Replace Character Filter:进行正则匹配替换
会影响后续tokenizer解析的position和offset信息

Tokenizers

将原始文本按照一定规则切分为单词(term or token)
自带的如下:
1.standard 按照单词进行分割
2.letter 按照非字符类进行分割
3.whitespace 按照空格进行分割
4.UAX URL Email 按照standard进行分割,但不会分割邮箱和URL
5.Ngram 和 Edge NGram 连词分割
6.Path Hierarchy 按照文件路径进行分割

Token Filters

对于tokenizer输出的单词(term)进行增加、删除、修改等操作
自带的如下:
1.lowercase 将所有term转为小写
2.stop 删除停用词
3.Ngram 和 Edge NGram 连词分割
4.Synonym 添加近义词的term

自定义分词
自定义分词需要在索引配置中设定 char_filter、tokenizer、filter、analyzer等


分词使用说明
分词会在如下两个时机使用:

创建或更新文档时(Index Time),会对相应的文档进行分词处理
查询时(Search Time),会对查询语句进行分词
1.查询时通过analyzer指定分词器
2.通过index mapping设置search_analyzer实现
3.一般不需要特别指定查询时分词器,直接使用索引分词器即可,否则会出现无法匹配的情况
分词使用建议

明确字段是否需要分词,不需要分词的字段就将type设置为keyword,可以节省空间和提高写性能
善用_analyze API,查看文档的分词结果

转载于:https://my.oschina.net/weiweiblog/blog/3016107

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值