Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 认知

  • 入门

  • 环境

  • 进阶

    • 核心概念
    • 系统架构
    • 单节点集群
    • 故障转移
    • 水平扩容
    • 应对故障
    • 路由计算
    • 分片控制
    • 写操作流程
    • 数据读流程
    • 更新操作流程
    • 批量操作流程
    • 倒排索引
      • 倒排索引原理
        • 正向索引
        • 倒排索引
    • 文档搜索
    • 文档刷新-刷写-合并
    • 文档分析-分词器
    • 文档控制
    • 文档展示-kibana
  • 框架集成

  • 优化

  • 面试题

  • Database-Elasticsearch
  • 进阶
Shetengteng
2022-02-03

倒排索引

分片是Elasticsearch最小的工作单元。但是究竟什么是一个分片,它是如何工作的?

  • 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力。最好的支持是一个字段多个值需求的数据结构是倒排索引

# 倒排索引原理

Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索,有倒排索引,肯定会对应有正向索引正向索引(forward index),反向索引(inverted index 即倒排索引)

# 正向索引

搜索引擎会将待搜索的文件都对应一个文件 ID,搜索时将这个ID 和搜索关键字进行对应,形成 K-V 对,然后对关键字进行统计计数

# 倒排索引

互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为倒排索引,把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词

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

# 示例

  • 如,假设有两个文档,每个文档的 content 域包含如下内容
    • The quick brown fox jumped over the lazy dog
    • Quick brown foxes leap over lazy dogs in summer
  • 为了创建倒排索引首先将每个文档的 content 域拆分成单独的词(称为词条或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示
Term Doc_1 Doc_2
Quick x
The x
brown x x
dog x
dogs x
fox x
foxes x
in x
jumped x
lazy x x
leap x
over x x
quick x
summer x
the x
  • 现在,如果想搜索 quick brown ,只需要查找包含每个词条的文档
Term Doc_1 Doc_2
Quick x
brown x x
Total 1 2
  • 两个文档都匹配,但是Doc_2比Doc_1匹配度更高。如果使用仅计算匹配词条数量的简单相似性算法,那对于查询的相关性来讲,Doc_2比Doc_1更佳

  • 但目前的倒排索引有一些问题

    • Quick和quick以独立的词条出现,然而用户可能认为它们是相同的词

    • fox和foxes非常相似,就像dog和dogs,它们有相同的词根

    • jumped和leap,尽管没有相同的词根,但它们的意思很相近,它们是同义词

  • 使用前面的索引搜索+Quick和+fox不会得到任何匹配文档

    • +前缀表明这个词必须存在
    • 只有同时出现Quick和fox 的文档才满足这个查询条件,但一个文档包含quick fox ,另一个文档包含Quick foxes
  • 用户可以合理的期望两个文档与查询匹配

    • 若将词条规范为标准模式,那么可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档,如
      • Quick可以小写化为quick
      • foxes可以词干提取变为词根的格式为fox
      • dogs可以为提取为dog
      • jumped和leap是同义词,可索引为相同的单词jump
    • 现在索引表转换成如下内容
    Term Doc_1 Doc_2
    brown x x
    dog x x
    fox x x
    in x
    jump x x
    lazy x x
    over x x
    quick x x
    summer x
    the x x
    • 但搜索+Quick +fox 仍然 会失败,因为在索引中,已经没有Quick了。但如果对搜索的字符串使用与 content 域相同的标准化规则,会变成查询+quick +fox,这样两个文档都会匹配,分词和标准化的过程称为分析
      • 只能搜索在索引中出现的词条,所以索引文本和查询字符串必须标准化为相同的格式
Last Updated: 2022/04/10, 13:57:31
批量操作流程
文档搜索

← 批量操作流程 文档搜索→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式