精华内容
下载资源
问答
  • Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。 例如,假设我们有两个文档,每个文档的 ...

    ElasticSearch汇总请查看:ElasticSearch教程——汇总篇

     

    倒排索引

    Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

    例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

    1. The quick brown fox jumped over the lazy dog
    2. Quick brown foxes leap over lazy dogs in summer

    为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

    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   |
    ------------------------

    现在,如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档:

    Term      Doc_1  Doc_2
    -------------------------
    brown   |   X   |  X
    quick   |   X   |
    ------------------------
    Total   |   2   |  1

    两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

    但是,我们目前的倒排索引有一些问题:

    • Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。
    • fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。
    • jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

    使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)只有同时出现 Quick 和 fox 的文档才满足这个查询条件,但是第一个文档包含 quick fox ,第二个文档包含 Quick foxes 。

    我们的用户可以合理的期望两个文档与查询匹配。我们可以做的更好。

    如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。例如:

    • Quick 可以小写化为 quick 。
    • foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。
    • jumped 和 leap 是同义词,可以索引为相同的单词 jump 。

    现在索引看上去像这样:

    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
    ------------------------

    这还远远不够。我们搜索 +Quick +fox 仍然 会失败,因为在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询 +quick +fox ,这样两个文档都会匹配!

     

     

    倒排索引结构

    (1)包含这个关键词的document list
    (2)包含这个关键词的所有document的数量:IDF(inverse document frequency)
    (3)这个关键词在每个document中出现的次数:TF(term frequency)
    (4)这个关键词在这个document中的次序
    (5)每个document的长度:length norm
    (6)包含这个关键词的所有document的平均长度
     

     

    倒排索引不可变

    优点

    (1)不需要锁,提升并发能力,避免锁的问题
    (2)数据不变,一直保存在os cache中,只要cache内存足够
    (3)filter cache一直驻留在内存,因为数据不变
    (4)可以压缩,节省cpu和io开销
     

    缺点

    每次都要重新构建整个索引,比较繁琐。

    展开全文
  • 关于倒排索引简单明了的总结

    千次阅读 2019-04-24 16:43:06
    关于像ElasticSearch什么的实时搜索引擎都是应用的倒排索引,关于倒排索引解释有的人啰里啰嗦说一堆看完整的云里雾里的;所以自己进行了简单的总结: 倒排索引是目前搜索引擎公司对搜索引擎最常用的存储方式,也是...

    关于像ElasticSearch什么的实时搜索引擎都是应用的倒排索引,关于倒排索引解释有的人啰里啰嗦说一堆看完整的云里雾里的;所以自己进行了简单的总结:

    倒排索引是目前搜索引擎公司对搜索引擎最常用的存储方式,也是搜索引擎的核心内容,在搜索引擎的实际应用中,有时需要按照关键字的某些值查找记录,所以是按照关键字建立索引,这个索引就被称为倒排索引。

    首先你要明确,索引这东西,一般是用于提高查询效率的。举个最简单的例子,已知有5个文本文件,需要我们去查某个单词位于哪个文本文件中,最直观的做法就是挨个加载每个文本文件中的单词到内存中,然后用for循环遍历一遍数组,直到找到这个单词。这种做法就是正向索引的思路。

    正向索引的这种查询效率也不需要我多吐槽了。倒排索引的思路其实也并不难。再举一个例子,有两段文本

    D1:Hello, conan!

    D2:Hello, hattori!

    第一步,找到所有的单词

    Hello、conan、hattori

    第二步,找到包含这些单词的文本位置

    Hello(D1,D2)

    conan(D1)

    hattori(D2)

    我们将单词作为Hash表的Key,将所在的文本位置作为Hash表的Value保存起来。

    当我们要查询某个单词的所在位置时,只需要根据这张Hash表就可以迅速的找到目标文档。

    结合之前的说的正向索引,不难发现。正向索引是通过文档去查找单词,反向索引则是通过单词去查找文档。

    倒排索引的优点还包括在处理复杂的多关键字查询时,可在倒排表中先完成查询的并、交等逻辑运算,得到结果后再对记录进行存取,这样把对文档的查询转换为地址集合的运算,从而提高查找速度。

    展开全文
  • ElasticSearch——倒排索引和正向索引 1、正向索引 正向索引 (forward index) 以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档 这种组织...

    ElasticSearch——倒排索引和正向索引

    1、正向索引

    正向索引 (forward index) 以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档

    这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护:

    • 若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。
    • 若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除

    缺点:

    • 检索效率太低,只能在一起简单的场景下使用

    假设有文档一(id为doc_1)和文档二(id为doc_2),

    文档一:my name is zhangsan

    文档二:my car is BMW

    文档一和文档二的正向索引为:

    文档id关键词
    doc_1my ,name, is, zhangsan
    doc_2my ,car ,is ,BMW

    假设使用正向索引,那么当你搜索 ‘name’ 的时候,搜索引擎必须检索文档中的每一个关键词,假设一个文档中包含成千上百个关键词,可想而知,会造成大量的资源浪费。于是倒排索引应运而生。

    2、倒排索引

    倒排索引 ,一般也被称为反向索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

    倒排索引以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档。

    一个表项就是一个字段,它记录该文档的ID和字符在该文档中出现的位置情况。

    优缺点:

    • 查询的时候由于可以一次得到查询关键字所对应的所有文档,所以查询效率高于正排索引。
    • 由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂

    假设有文档一(id为doc_1)和文档二(id为doc_2),

    文档一:my name is zhangsan

    文档二:my car is BMW

    文档一和文档二的倒排索引为:

    关键词文档id
    mydoc_1,doc_2
    namedoc_1
    isdoc_1,doc_2
    zhangsandoc_1
    cardoc_2
    BMWdoc_1

    倒排索引是相对正向索引而言的,你也可以将其理解为逆向索引。它是一种关键词与文档一一对应的数据结构。

    3、倒排索引的组成

    ES 倒排索引包含两个部分:单词词典和倒排列表

    单词词典(Term Dictionary)

    单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。
    对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词,这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构。

    单词词典的特性:

    1. 是文档集合中所有单词的集合
    2. 它是保存索引的最小单位
    3. 其中记录着指向倒排列表的指针

    用B+Tree 实现单词词典,存储在内存:

    在这里插入图片描述

    倒排列表

    倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息及频率(作关联性算分),每条记录称为一个倒排项(Posting)。

    根据倒排列表,即可获知哪些文档包含某个单词。

    倒排项(Posting)主要包含如下信息:

    • 文档id用于获取原始信息

    • 单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分

    • 位置(Position),记录单词在文档中的分词位置(多个),用于做词语搜索(Phrase Query)

    • 偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示

    单词词典和倒排列表整合到一起的结构如下:

    在这里插入图片描述

    4、倒排索引的更新策略

    搜索引擎需要处理的文档集合往往都是动态集合,即在建好初始的索引后,不断有新文档进入系统,同时原先的文档集合内有些文档可能被删除或更改。

    动态索引通过在内存中维护临时索引,可以实现对动态文档和实时搜索的支持。

    服务器内存总是有限的,随着新加入系统的文档越来越多,临时索引消耗的内存也会随之增加。

    当最初分配的内存将被使用完时,要考虑将临时索引的内容更新到磁盘索引中,以释放内存空间来容纳后续的新进文档。

    索引基本更新思想:

    • 倒排索引就是对初始文档集合建立的索引结构,一般单词词典都存储在内存,对应的倒排列表存储在磁盘文件中
    • 临时索引是在内存中实时建立的倒排索引,其结构和前述的倒排索引是一样的,区别在于词典和倒排列表都在内存中存储。
    • 新文档进入系统时,实时解析文件并将其加入到临时索引结构中。
    • 删除文档列表则用来存储已被删除的文档的相应的文档ID,形成一个文档ID列表。
    • 修改文档可以认为是旧文档先被删除,然后系统在增加一篇新的文档,通过这种间接方式实现对内容更改的支持。

    5、倒排索引四种更新策略

    常用的索引更新策略主要有四种:完全重建策略、再合并策略、原地更新策略及混合策略。

    1. **完全重建策略:**当新增文档到达一定数量,将新增文档和原先的老文档整合,然后利用静态索引创建方法对所有文档重建索引,新索引建立完成后老索引会被遗弃。此法代价高,但是主流商业搜索引擎一般是采用此方式来维护索引的更新(这句话是书中原话)
    2. 再合并策略:当新增文档进入系统,解析文档,之后更新内存中维护的临时索引,文档中出现的每个单词,在其倒排表列表末尾追加倒排表列表项;一旦临时索引将指定内存消耗光,即进行一次索引合并,这里需要倒排文件里的倒排列表存放顺序已经按照索引单词字典顺序由低到高排序,这样直接顺序扫描合并即可。其缺点是:因为要生成新的倒排索引文件,所以对老索引中的很多单词,尽管其在倒排列表并未发生任何变化,也需要将其从老索引中取出来并写入新索引中,这样对磁盘消耗是没必要的。
    3. **原地更新策略:**试图改进再合并策略,在原地合并倒排表,这需要提前分配一定的空间给未来插入,如果提前分配的空间不够了需要迁移。实际显示,其索引更新的效率比再合并策略要低。
    4. **混合策略:**出发点是能够结合不同索引更新策略的长处,将不同索引更新策略混合,以形成更高效的方法。
    展开全文
  • Elasticsearch倒排索引

    2021-05-10 15:06:33
    倒排索引前言一、倒排索引的内部结构1.Term index2.Term Dictionary字典数据结构3.与mysql对比二、FST(Finite State Transducer)总结 前言 Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索...


    前言

    Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、倒排索引的内部结构

    在这里插入图片描述

    1.Term index

    Lucene 的倒排索引,增加了最左边的一层「字典树」term index,它不存储所有的单词,只存储单词前缀,通过字典树找到单词所在的块,也就是单词的大概位置,再在块里二分查找,找到对应的单词,再找到单词对应的文档列表,term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。

    2.Term Dictionary

    为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary

    字典数据结构

    数据结构优缺点
    排序列表Array/List使用二分法查找,不平衡
    HashMap/TreeMap性能高,内存消耗大,几乎是原始数据的三倍
    Skip List跳跃表,可快速查找词语,在lucene、redis、Hbase等均有实现。相对于TreeMap等结构,特别适合高并发场景(Skip List介绍)
    Trie适合英文词典,如果系统中存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存(数据结构之trie树)
    Double Array Trie适合做中文词典,内存占用小,很多分词工具均采用此种算法(深入双数组Trie)
    Ternary Search Tree三叉树,每一个node有3个节点,兼具省空间和查询快的优点(Ternary Search Tree)
    Finite State Transducers (FST)一种有限状态转移机,Lucene 4有开源实现,并大量使用

    3.与mysql对比

    Mysql只有term dictionary这一层,是以树的方式存储在磁盘上的。检索一个term需要若干次的random access的磁盘操作。而Lucene在term dictionary的基础上添加了term index来加速检索,term index以树的形式缓存在内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘的random access次数。term index在内存中是以FST(finite state transducers)的形式保存的,其特点是非常节省内存。Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩。

    二、FST(Finite State Transducer)

    lucene从4开始大量使用的数据结构是FST(Finite State Transducer)。FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。
    FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。
    FST压缩率一般在3倍~20倍之间,相对于TreeMap/HashMap的膨胀3倍,内存节省就有9倍到60倍!

    总结

    Lucene/Elasticsearch就是尽量将磁盘里的东西搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种压缩算法,高效使用内存,从而达到快速搜索的特性。

    展开全文
  • 正排索引和倒排索引简单介绍

    千次阅读 2019-01-16 16:20:35
    正排索引和倒排索引简单介绍  在搜索引擎中,数据被爬取后,就会建立index,方便检索。  在工作中经常会听到有人问,你这个index是正排的还是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些简单的介绍。...
  • 搜索引擎之正排与倒排索引

    千次阅读 2018-09-27 15:04:27
    排索引(正向索引) 正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。 正排表结构如图1所示,这种组织方法在建立索引的时候...
  • 上一遍学习了倒排索引的原理,这里找到一篇文章,详细分析了倒排索引的一些实现原理,转载如下:   阅读目录 倒排索引 搜索引擎如何工作? 如何建立倒排索引 总结 回到目录 倒排索引 回到目录 搜索引擎...
  • 比如有这样2个文档: The quick brown fox jumped over the lazy dog Quick brown foxes leap over lazy dogs in summer 为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 ...
  • 倒排索引,分片机制

    2020-02-23 19:27:27
    倒排索引 Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。 例如,假设我们有两个文档,每个文档的...
  • 倒排索引

    2020-06-04 15:45:29
    排索引是指文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所有包含查询关键字的文档。 假设网页A的局部文档ID是 TA, 网页B的局部文档ID是...
  • Elasticsearch-倒排索引原理

    千次阅读 2020-12-16 23:25:42
    Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型数据库的b...
  • MySQL哈希索引的数据结构以及索引优缺点

    千次阅读 多人点赞 2021-08-03 11:27:39
    MySQL哈希索引结构的实现,以及索引优缺点
  • 搜索引擎:该如何设计你的倒排索引? 搜索引擎如何工作? 信息检索已经发展的非常成熟了,应该所有人都不陌生。我有幸这几年接触过并且实际做过一些搜索引擎开发的工作,特此总结并分享给大家。实际上...
  • Elasticsearch快速检索之倒排索引算法

    千次阅读 2019-09-25 11:05:09
    来源: 博客园  ...Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene...为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条...
  • 【概述】 倒排表是对次关键码的一种索引表,其...倒排索引的优点在于查找记录的速度很快,有时不用读取记录即可得到结果,而且由于其并未对文件进行修改,使用和维护都比较简单。 但由于倒排表中的记录号表长是...
  • 索引的建立方式有正排和倒排。记文档为doc,关键字为word。看如下文档A,记文档ID为doc1: The boy has great potential. His name is Peeta. 一、正排索引 以文档ID为主键key,记录每个词及其出现的次数,检索...
  • 搜索引擎如何工作?...今天我所讲的是一个简化版的搜索引擎,简化到只涉及到倒排建立和拉取。虽然简单,但是它是整个搜索引擎的最核心组件。一个最简单的搜索引擎如下图所示: merger: 接收查.
  • 倒排索引 阅读目录 倒排索引 搜索引擎如何工作? 如何建立倒排索引 总结 回到目录 倒排索引 回到目录 搜索引擎如何工作? 信息检索已经发展的非常成熟了,应该所有人都不陌生。我有幸这几年...
  • 与内存型相比,这种方式适合在内存小,磁盘大的情况下进行倒排索引的建立,它的优缺点如下。 优点:内存使用量小,没有磁盘随机读写,基本全是顺序读写。对于超大规模文档集合来说,这种方式相对灵活一些(主要是...
  • 所以时间复杂度介于顺序查找和有序查找之间计算分块索引的平均查找长度优缺点倒排索引 inverted index用一个例子讲解名字的由来优缺点记录号表的改进方向 第一篇关于查找的文章介绍了一种最基础的无序查找(顺序查找...
  • 搜索引擎之倒排索引及性能优化 文章目录搜索引擎之倒排索引及性能优化1. 搜索引擎的一般线上架构2. 倒排索引(Inverted Index)及性能优化2.1 词的经验分布zipf's law2.2 倒排的一些基本概念2.2.1 常用词典数据结构2.3...
  • 一:线性索引【索引表】 就是将索引项集合组织为线性结构,也称为索引表 二:稠密索引 三:分块索引 四:倒排索引 ...
  • 1. 问:索引是什么,多加索引好吗? 数据库索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 DB在执行一条sql语句的时候,默认的方式是根据搜索条件进行全...
  • 查找——索引顺序表和倒排

    千次阅读 2020-06-26 21:12:52
    查找8.3 索引顺序表和倒排表8.3.1 索引顺序表 8.3 索引顺序表和倒排表 当数据表中的数据元素个数n很大时,如果用顺序查找结构,则查找效率极低。如果采用有序表存储形式的折半查找,则为了维持数据表的有序性,时间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,596
精华内容 1,838
关键字:

倒排索引的优缺点