ES:倒排索引、分词详解

一,倒排索引(Inverted Index)

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

一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表
示例:
对以下三个文档去除停用词后构造倒排索引
在这里插入图片描述
倒排索引-查询过程

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

  1. 通过倒排索引获得“搜索引擎”对应的文档id列表,有1,3
  2. 通过正排索引查询1和3的完整内容
  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,查看文档的分词结果
  • 26
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值