赞
踩
正向索引 (forward index) 以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档
这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护:
缺点:
如果是根据id查询,那么直接走索引,查询速度非常快。
但如果是基于某个关键字做模糊查询,只能是逐行扫描数据,流程如下:
1)用户搜索数据,条件是name符合 "%线性%"
2)逐行获取数据,比如id为109的数据
3)判断数据中的name是否符合用户搜索条件
4)如果符合则放入结果集,不符合则丢弃。
回到步骤1 逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就 是一场灾难
倒排索引 ,一般也被称为反向索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
倒排索引以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档。
一个表项就是一个字段,它记录该文档的ID和字符在该文档中出现的位置情况。
倒排索引中有两个非常重要的概念: 文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商 品信息 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词 条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
将每一个文档的数据利用算法分词,得到一个个词条 创建表,每行数据包括词条、词条所在文档id、位置等信息 因为词条唯一性,可以给词条创建索引,例如hash表结构索引
正排索引:
倒排索引:
倒排索引的搜索流程如下(以搜索"华为手机"为例):
1)用户输入条件 "大学线性代数"进行搜索。
2)对用户输入内容分词,得到词条:大学、线性、代数。
3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:101,103,105。
4)拿着文档id到正向索引中查找具体文档。
虽然要先查询倒排索引,再查询正排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常 快!无需全表扫描。
ES 倒排索引包含两个部分:单词词典和倒排列表
单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。
对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词,这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构。
单词词典的特性:
用B+Tree 实现单词词典,存储在内存。
倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息及频率(作关联性算分),每条记录称为一个倒排项(Posting)。
根据倒排列表,即可获知哪些文档包含某个单词。
倒排项(Posting)主要包含如下信息:
文档id用于获取原始信息
单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分
位置(Position),记录单词在文档中的分词位置(多个),用于做词语搜索(Phrase Query)
偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判
断文档中是否包含所需要的词条,是根据文档找词条的过程。
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id
获取文档。是根据词条找文档的过程。
正向索引:
优点:
可以给多个字段创建索引
根据索引字段搜索、排序速度非常快
缺点:
根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
倒排索引:
优点:
根据词条搜索、模糊搜索时,速度非常快
缺点:
只能给词条创建索引,而不是字段
无法根据字段做排序
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。