天天看点

Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

1 倒排索引

1.1 书的目录和索引

  • 正排索引即目录页,根据页码去找内容
  • Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词
  • 倒排索引即索引页,根据关键词去找对应页码
  • Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

1.2 搜索引擎

  • 正排索引

    文档Id =》文档内容、单词的关联关系

  • 倒排索引

    单词 =》 文档Id的关联关系

  • 左:正排索引 =》 右:倒排索引
  • Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

倒排索引查询流程

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

  1. 通过倒排索引获得"搜索引擎”对应的文档Id有1和3
  2. 通过正排索引查询1和3的完整内容
  3. 返回最终结果

1.3 倒排索引的组成

1.3.1 单词词典( Term Dictionary )

倒排索引的重要组成

  • 记录所有文档的单词 ,一般都比较大
  • 记录单词到倒排列表的关联信息

单词字典的实现一般是用B+ Tree ,示例如下

Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

1.3.2 倒排列表( Posting List )

记录了单词对应的文档集合,由倒排索引项( Posting )组成。

倒排索引项( Posting )主要包含如下信息:

  • 文档Id ,用于获取原始信息
  • 单词频率( TF, Term Frequency ),记录该单词在该文档中的出现次数,用于后续相关性算分
  • 位置( Position)

    记录单词在文档中的分词位置(多个) , 用于做词语搜索( Phrase Query )

  • 偏移( Offset )

    记录单词在文档的开始和结束位置,用于做高亮显示

案例

以搜索引擎为例

Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

单词字典与倒排列表整合在一起的结构

Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

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

2 分词

将文本转换成一系列单词的过程,也称文本分析,在 ES 里称为 Analysis。

比如文本【JavaEdge 是最硬核的公众号】,分词结果是【JavaEdge、硬核、公众号】

2.1 Analyzer-分词器

分词器是 ES 专门处理分词的组件,组成如下:

2.1.1 Character Filters

在Tokenizer之前对原始文本进行处理,比如增加、删除或替换字符等。

针对原始文本进行处理,比如去除 html 特殊标记符,自带的如下:

HTML Strip 去除 html 标签和转换 html 实体

Mapping 进行字符替换操作

Pattern Replace 进行正则匹配替换

会影响后续tokenizer解析的postion和offset信息

Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词

2.1.2 Tokenizer

将原始文本按照一定规则切分为单词,内置:

  • standard 按单词进行分割
  • letter 按非字符类进行分割
  • whitespace 按空格进行分割
  • UAX URL Email 按 standard 分割,但不会分割邮箱和 url
  • NGram 和 Edge NGram 连词分割
  • Path Hierachy 按文件路径进行分割

示例:

POST _analyze
{
    "tokenizer":"path_hierarchy",
    "text":"/one/two/three"
}      
Elasticsearch实战(五)-倒排索引与分词(上)1 倒排索引2 分词