03 | 倒排索引 & 分词

逸兴
逸兴
逸兴
57
文章
25
评论
2020-03-3119:56:561 2121字阅读5分15秒
摘要

Elasticsearch 为什么搜索块,Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。
本文简单介绍“倒排索引” 和 es内置分词器,以及中文分词

概念介绍

正排索引

在说倒排索引之前,先说下正排索引。正排索引又叫“前向索引”,它为每一个文档建立一个ID,通过ID可以定位到文档位置,就像书籍的“目录”一样,每一个章节都会有一个“页码”,通过这个目录可以很方便的找到章节在书中对应的位置。如果要新增一个章节只需要在目录中添加 章节与页码的对应关系;如果删除一个章节可以通过目录找到对应的页码,删除这页码并在目录中删掉这个映射即可。正排索引就是文档ID到文档内容的关系。

03 | 倒排索引 & 分词

如果要搜索某个关键词在哪些文档中出现,则需要全文扫描所有文档,才能得出结果。

正排索引结构简单,使用方便,但在关键词搜索时效率低,只能在简单场景下使用。

倒排索引

一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。倒排索引可以看做每个词的列表的集合。

建立倒排索引会把文档拆分成一个的“单词”(称之为 词条 或者 token),并创建一个包含所有不重复词条的排序列表,然后列出每个词条出现次数,出现在哪个文档及那个位置。如:

03 | 倒排索引 & 分词

如图所示,ElasticSearch 共出现3次,分别是 1号文档的第1个单词(单词计算从0开始),2号文档的第0个单词,3号文档的第0个单词 1:1,2:0,3:0

通过这种索引,我们可以快速的找到某个单词出现的频率,以及在文档中的位置。

倒排索引的核心组成:

倒排索引包含两个部分

  • 单词词的(Term Dictionary),记录所有文档的单词。记录单词到倒排列表的关联关系
    • 单词词典一般比较大,可以通过B+树 或 哈希拉链法实现,以满足高性能的插入和查询
  • 倒排列表(Posting List) 记录了单词对应的文档结合,由倒排索引项组成
    • 倒排索引项(Posting)
      • 文档 ID
      • 词频 TF - 该单词在文档中出现的次数,用于相关性评分
      • 位置(Position) - 单词在文档中分词的位置,用于语句搜索
      • 偏移 (offset) - 记录单词在文档中的结束位置,实现高亮显示
03 | 倒排索引 & 分词

ElasticSearch 中每个json文档中的每个字段都有自己的倒排索引。

  • 可以指定某些字段,不做索引;
    • 优点:节省磁盘空间
    • 缺点:这些字段不能被搜索

分词处理

前面说到“倒排索引”是记录的每个不重复单词的信息,那么ElasticSearch 如何将一个文档,分成一个个的单词,分词过程中 大小写单词如果处理,同义词与近义词算不算一个词。

分词:Analysis文本分析是把全文本转换成一系列单词(term/token)的过程,也叫分词。

Analysis 整个过程是通过分词器(Analyze)实现的,ElasticSearch中内置了多种分词器,也可按需定制分词器。

ElasticSearch 中的分词器,不光在数据写入时转换词条,匹配查询语句时也需要用相同的分析器对查询语句进行分析。

03 | 倒排索引 & 分词

Analyzer 的组成

分词器是专门处理分词的组件,由三部分组成,其组成及处理过程如下:

03 | 倒排索引 & 分词
  1. Character Filters:获取原始文本进行处理,例如去除html标签等
  2. Tokenizer:按照规则将文本切分为单词
  3. Token Filters: 将切分的单词进行加工,大小写处理,删除 stopwords,增加同义词等

ElasticSearch 内置分词器

Simple Analyzer按照非字母切分(符号被过滤),小写处理
Stop Analyzer小写处理,停用词过滤(the,a,is)
Whitespace Analyzer按照空格切分,不转小写
Keyword Analyzer不分词,直接将输入当作输出
Patter Analyzer正则表达式,默认 \W+ (非字符分隔)
Language提供了30多种常见语言的分词器

Analyzer API的使用

可通过三种方式查看 分词器是如何工作的;

1、直接指定Analyze 进行测试,使用standard 分词器

03 | 倒排索引 & 分词
03 | 倒排索引 & 分词

2、指定索引的字段进行测试

03 | 倒排索引 & 分词

3、自定义分词进行测试

03 | 倒排索引 & 分词



https://www.hugbg.com/archives/1923.html
逸兴
  • 本文由 发表于 2020-03-3119:56:56
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
自动更新SSL证书 默认分类

自动更新SSL证书

现在免费的SSL证书只有三个月有效期,有一个博客和图床都用的ssl证书到期需要重新签发,挺麻烦的。原本想着写个脚本通过阿里云的 OpenAPI 进行证书的签发和部署,但是偶然发现了 ACME 这个项目...
推导式、生成式与生成器 基础语法

推导式、生成式与生成器

推导式 概述 Python中的推导式是一种快速、简洁的数据结构创建方式,不需要手动创建数据结构中的每一个元素,类似于给出一个规律,python会根据这个规律自动填充数据结构。支持有列表推导式、字典推导...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:1   其中:访客  1   博主  0
    • 老司机 老司机 1

      程序漏洞叫特性,设计漏洞叫特色 —沃·兹基·硕得