培训 网站 模板,如何制作班级网站,企业网站建设具体步骤,图片搜索关于倒排索引 搜索引擎通常检索的场景是#xff1a;给定几个关键词#xff0c;找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型#xff0c;通过这个模型我们可以很方便知道某篇文档包含哪些关键词#xff0c;某…关于倒排索引 搜索引擎通常检索的场景是给定几个关键词找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型通过这个模型我们可以很方便知道某篇文档包含哪些关键词某个关键词被哪些文档所包含。单词-文档矩阵的具体数据结构可以是倒排索引、签名文件、后缀树等。 倒排索引源于实际应用中需要根据属性的值来查找记录lucene是基于倒排索引实现的。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值而是由属性值来确定记录的位置因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件简称倒排文件(inverted file)。倒排索引一般表示为一个关键词然后是它的频度出现的次数位置出现在哪一篇文章或网页中及有关的日期作者等信息它相当于为互联网上几千亿页网页做了一个索引好比一本书的目录、标签一般。读者想看哪一个主题相关的章节直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页一页一页的查找。 倒排索引由两个部分组成单词词典和倒排文件。 倒排文件 所有单词的倒排列表顺序的存储在磁盘的某个文件里这个文件即被称为倒排文件倒排文件是存储倒排索引的物理文件。 单词词典 单词词典是由文档集合中出现过的所有单词构成的字符串集合单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。单词词典是倒排索引中非常重要的组成部分它是用来维护文档集合中所有单词的相关信息同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时根据用户的查询词去单词词典里查询就能够获得相应的倒排列表。对于一个规模很大的文档集合来说可能包含了几十万甚至上百万的不同单词快速定位某个单词直接决定搜索的响应速度所以我们需要很高效的数据结构对单词词典进行构建和查找。常用的数据结构包含哈希加链表和树形词典结构。 Lucene倒排索引原理 Lucerne使用的是倒排文件索引结构。该结构及相应的生成算法如下 设有两篇文章1和2 文章1的内容为Tom lives in Guangzhou,I live in Guangzhou too. 文章2的内容为He once lived in Shanghai. 1取得关键词 由于lucene是基于关键词索引和查询的首先我们要取得这两篇文章的关键词通常我们需要如下处理措施 a.我们现在有的是文章内容即一个字符串我们先要找出字符串中的所有单词即分词。英文单词由于用空格分隔比较好处理。中文单词间是连在一起的需要特殊的分词处理。 b.文章中的”in”, “once” “too”等词没有什么实际意义中文中的“的”“是”等字通常也无具体含义这些不代表概念的词可以过滤掉 c.用户通常希望查“He”时能把含“he”“HE”的文章也找出来所以所有单词需要统一大小写。 d.用户通常希望查“live”时能把含“lives”“lived”的文章也找出来所以需要把“lives”“lived”还原成“live” e.文章中的标点符号通常不表示某种概念也可以过滤掉 在lucene中以上措施由Analyzer类完成。 经过上面处理后 文章1的所有关键词为[tom] [live] [guangzhou] [i] [live] [guangzhou] 文章2的所有关键词为[he] [live] [shanghai] 2建立倒排索引 有了关键词后我们就可以建立倒排索引了。上面的对应关系是“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来变成: “关键词”对“拥有该关键词的所有文章号”。 文章12经过倒排后变成 关键词 文章号 guangzhou 1 he 2 i 1 live 1,2 shanghai 2 tom 1 通常仅知道关键词在哪些文章中出现还不够我们还需要知道关键词在文章中出现次数和出现的位置通常有两种位置 a.字符位置即记录该词是文章中第几个字符优点是关键词亮显时定位快 b.关键词位置即记录该词是文章中第几个关键词优点是节约索引空间、词组phase查询快lucene中记录的就是这种位置。 加上“出现频率”和“出现位置”信息后我们的索引结构变为 1 2 3 4 5 6 7 8 关键词 文章号[出现频率] 出现位置 guangzhou 1[2] 36 he 2[1] 1 i 1[1] 4 live 1[2] 25, 2[1] 2 shanghai 2[1] 3 tom 1[1] 1 以live 这行为例我们说明一下该结构live在文章1中出现了2次文章2中出现了一次它的出现位置为“2,5,2”这表示什么呢我们需要结合文章号和出现频率来分析文章1中出现了2次那么“2,5”就表示live在文章1中出现的两个位置文章2中出现了一次剩下的“2”就表示live是文章2中第 2个关键字。 以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的lucene没有使用B树结构因此lucene可以用二分搜索算法快速定位关键词。 3实现 实现时lucene将上面三列分别作为词典文件Term Dictionary、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词还保留了指向频率文件和位置文件的指针通过指针可以找到该关键字的频率信息和位置信息。 Lucene中使用了field的概念用于表达信息所在位置如标题中文章中url中在建索引中该field信息也记录在词典文件中每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。 4压缩算法 为了减小索引文件的大小Lucene对索引还使用了压缩技术。 首先对词典文件中的关键词进行了压缩关键词压缩为前缀长度后缀例如当前词为“阿拉伯语”上一个词为“阿拉伯”那么“阿拉伯语”压缩为3语。 其次大量用到的是对数字的压缩数字只保存与上一个值的差值这样可以减小数字的长度进而减少保存该数字需要的字节数。例如当前文章号是16389不压缩要用3个字节保存上一文章号是16382压缩后保存7只用一个字节。 5应用原因 下面我们可以通过对该索引的查询来解释一下为什么要建立索引。 假设要查询单词 “live”lucene先对词典二元查找、找到该词通过指向频率文件的指针读出所有文章号然后返回结果。词典通常非常小因而整个过程的时间是毫秒级的。 而用普通的顺序匹配算法不建索引而是对所有文章的内容进行字符串匹配这个过程将会相当缓慢当文章数目很大时时间往往是无法忍受的。 整理自 Lucene 工作原理之倒排索引 Lucene倒排索引转载于:https://www.cnblogs.com/duanxz/p/3559103.html