问答题818/1053在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的?

难度:
2021-11-02 创建

参考答案:

Elasticsearch 中,倒排索引(Inverted Index)是核心的技术之一,它使得文本搜索变得高效。在倒排索引中,**每个词(term)**都对应一个列表,列出了包含该词的文档。这种索引结构允许 Elasticsearch 在查询时快速查找包含特定词的文档,类似于传统书籍中的索引。

倒排索引的工作原理

  1. 文档的分词
    当文档被索引时,Elasticsearch 会对文档内容进行 分词(Tokenization),将文本拆分成一系列的 词(terms)。例如,一篇文档内容为:

    "Elasticsearch is a distributed search engine"
    

    被拆分成的词可能是:

    ["Elasticsearch", "is", "a", "distributed", "search", "engine"]
    
  2. 倒排索引的构建

    • Elasticsearch 会将每个词(term)和它所在的文档 ID(Doc ID)建立一个映射关系。
    • 这个映射被存储在 倒排索引(inverted index) 中,其中每个词都有一个与之相关的文档列表,记录了哪些文档中包含该词。

    假设有两个文档:

    • 文档 1 内容:"Elasticsearch is a search engine"
    • 文档 2 内容:"Elasticsearch is distributed"

    分词后,倒排索引可能如下所示:

    "Elasticsearch" -> [1, 2]  (在文档 1 和 2 中都出现)
    "is" -> [1, 2]  (在文档 1 和 2 中都出现)
    "a" -> [1]  (仅在文档 1 中出现)
    "distributed" -> [2]  (仅在文档 2 中出现)
    "search" -> [1]  (仅在文档 1 中出现)
    "engine" -> [1]  (仅在文档 1 中出现)
    
  3. 查找倒排索引

    • 当用户查询某个词时,Elasticsearch 会查找该词在倒排索引中的条目。
    • 例如,用户查询词 "Elasticsearch",倒排索引会返回 [1, 2],表示这个词出现在文档 1 和文档 2 中。
  4. 多词查询

    • 当查询包含多个词时,Elasticsearch 会对每个词分别查找倒排索引,然后通过集合操作(如交集、并集等)合并查询结果。
    • 例如,查询 "Elasticsearch search",Elasticsearch 会查找:
      • "Elasticsearch" -> [1, 2]
      • "search" -> [1]
      • 结果是交集 [1],即文档 1 包含这两个词。
  5. 权重与相关性评分

    • 倒排索引不仅仅存储词与文档的映射,还可能包含关于每个词的 位置(Positional Indexing)、频率(Term Frequency, TF)等信息,以便对文档进行 相关性评分,计算该文档与查询的匹配度(如 TF-IDF 评分)。

    • 例如,如果查询词 "Elasticsearch" 在文档中出现了 3 次,而其他文档中仅出现了 1 次,那么文档 1 的相关性评分就更高。

查找过程简述:

  1. 当查询请求到达 Elasticsearch 时,查询词会被分词。
  2. 每个词会在倒排索引中查找对应的文档 ID。
  3. 如果查询包含多个词,Elasticsearch 会根据查询操作(交集、并集等)合并多个倒排索引结果。
  4. 结合文档的相关性评分,Elasticsearch 会返回与查询最相关的文档。

举个例子:

假设有 3 个文档,如下:

  • 文档 1: "Elasticsearch is a distributed search engine"
  • 文档 2: "Elasticsearch is fast"
  • 文档 3: "Search engines are powerful"

当查询词是 "Elasticsearch search" 时,Elasticsearch 的查询过程如下:

  1. 查询词 "Elasticsearch" 在倒排索引中返回的文档是 [1, 2]
  2. 查询词 "search" 在倒排索引中返回的文档是 [1, 3]
  3. 结果取交集,即 [1],表示 文档 1 包含这两个词。

最近更新时间:2024-12-12