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. 按照相似性得分由高到低排序输出.