1. 倒排索引作用:

  • es使用了倒排索引的结构,用于快速的全文搜索.
  • 类似于mysql建议对应的索引,提高查询速度.
  • 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表.

2. 实现方案:

(1). 原始文档:

文档ID     文档内容
-------------------------
1       |  PHP入门
2       |  java20天精通
3       |  go web设计
  • es的文档集有3个文档,每个文档有一个文档唯一值ID(1,2,3...).
  • 如果没有倒排索引,要查询"PHP"两个字,只能一个一个文档去查.

(2). 倒排索引(DocID):

单词ID    单词     倒序列表(DocID)
-----------------------------------
1     |   PHP   |   1,2,4,10
2     |   java  |  4,5,9,23
3     |   go    |   4,5,86,45
  • 倒排索引会利用中文分词在文档中,提取出不重复的单词. a. 使用分词系统将文档自动切分成单词序列. b. 每个文档就转换为由单词序列构成的数据流.
  • 每一个单词有一个唯一的id,还有相应单词的文档. a. 需要对每个不同的单词序列赋予唯一的单词编号. b. 同时记录下哪些文档包含这个单词.

(3). 倒排索引(DocID;TF):

单词ID    单词     倒序列表(DocID;TF)
---------------------------------------------
1      |  PHP   |   (1;1),(2;1),(4;1),10;1)
2      |  java  |   (4;1),(5;1),(9;1),(23;1)
3      |  go    |   (4;1),(5;1),(86;1),(45;1)
  • TF表示单词频率信息,即这个单词在某个文档中的出现次数.
  • 因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子.
  • 方便后续排序时进行分值计算.

(4). 倒排索引(DocID,,TF):

单词ID    单词     倒序列表(DocID,<position>,TF)
----------------------------------------------------
1      |  PHP   |   (1,<11>,1),(2,<7>,1),(3,<3,9>,2)
  • <11>表示单词在某个文档出现的位置信息.
  • (3,<3,9>,2)表示在文档ID3出现过2次,位置分别是3和9.

(5). 总结: 有了这个索引系统,搜索引擎可以很方便地响应用户的查询:

  • 用户输入"Facebook".
  • 搜索系统查找倒排索引,从中可以读出包含这个单词的文档,提供给用户作为搜索结果.
  • 额外的功能: a. 利用单词频率信息、文档频率信息对候选搜索的结果进行排序. b. 计算文档和查询的相似性. c. 按照相似性得分由高到低排序输出.