Elasticsearch使用一种称为倒排索引的结构,她适用于快速的全文搜索。
一个倒排索引由文档中所有不能重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
示例:
1、假设文档集合包含五个文档,每个文档内容表所示,表的最左端一栏是每个文档对应的文档编号,我们的任务就是对这个文档集合建立倒排索引。
文档编号 | 文档内容 |
---|---|
1 | 谷歌地图之父跳槽Facebook |
2 | 谷歌地图之父加盟Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟Facebook |
4 | 谷歌地图之父跳槽Facebook与Wave项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站facebook |
2、中文和英文等语言不同、单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引。
“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排索引。
单词ID | 单词 | 倒排索引(DocID) |
---|---|---|
1 | 谷歌 | 1,2,3,4,5 |
2 | 地图 | 1,2,3,4,5 |
3 | 之父 | 1,2,4,5 |
4 | 跳槽 | 1,4 |
5 | 1,2,3,4,5 | |
6 | 加盟 | 2,3,5 |
7 | 创始人 | 3 |
8 | 拉斯 | 3,5 |
9 | 离开 | 3 |
10 | 与 | 4 |
11 | Wave | 4 |
12 | 项目 | 4 |
13 | 取消 | 4 |
14 | 有关 | 4 |
15 | 社交 | 5 |
16 | 网站 | 5 |
3、索引系统还可以记录除此之外的更多信息,下表还记录了单词频率信息(TF)即这个单词在某个文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。
单词ID | 单词 | 倒排索引(DocID:TF) |
---|---|---|
1 | 谷歌 | (1:1),(2:1),(3:2),(4:1),(5:1) |
2 | 地图 | (1:1),(2:1),(3:1),(4:1),(5:1) |
3 | 之父 | (1:1),(2:1),(4:1),(5:1) |
4 | 跳槽 | (1:1),(4:1) |
5 | (1:1),(2:1),(3:1),(4:1),(5:1) | |
6 | 加盟 | (2:1),(3:1),(5:1) |
7 | 创始人 | (3:1) |
8 | 拉斯 | (3:1),(5:1) |
9 | 离开 | (3:1) |
10 | 与 | (4:1) |
11 | Wave | (4:1) |
12 | 项目 | (4:1) |
13 | 取消 | (4:1) |
14 | 有关 | (4:1) |
15 | 社交 | (5:1) |
16 | 网站 | (5:1) |
4、倒排列表中还可以记录单词在某个文档出现的位置信息
(1,<11>,1),(2,<7>,1),(3,<3,9>,2)
有了这个索引系统,搜索引擎可以很方便地相应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息既可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程。
示例:
#1. The quick brown fox jumped over the lazy dog
#2. Quick brown foxes leap over lazy dogs in summer
#倒排索引(x代表存在于的文档中):
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 |
#3.搜索quick brown(计算相关度分数时,文档1的匹配度高,分数会比文档2高):
Term | Doc_1 | Doc_2 |
---|---|---|
brown | x | x |
quick | x | |
Total | 2 | 1 |
#4、标准化规则(normalization):
Quick 和 quick 以独立的词条出现,然后用户可能认为它们是相同的词。
fox 和 foxes 非常相似,就像 dog 和 dogs,它们由相同的词根。
jumped 和 leap ,尽管没有相同的词根,但是它们的意思很相近,是同义词。
搜索含有 Quick fox的文档是搜不到的。
使用标准规划规则,建立倒排索引的时候,会对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率。
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 |