转自: http://www.cnblogs.com/forfuture1978/p/3945755.html 好好看看吧 倒排列表信息中词典相关存储的最关键格式 占倒排列表中文件大小的多数

我们来看最复杂的部分,就是Term Dictionary和Term Index文件,Term Dictionary文件的后缀名为tim,Term Index文件的后缀名是tip,格式如图所示。

Term Dictionary文件首先是一个Header,接下来是PostingsHeader,这两个的格式一致,但是保存的是不同的信息。SkipInterval是跳跃表的跳的幅度,MaxSkipLevels是跳跃表的层数,SkipMinimun是应用跳跃表的最小倒排表长度,接下来就是Term的部分了。

在tim文件中,Term是分成Block进行保存的,如何将Term进行分块,则需要和tip文件配合。Term Index文件对于每一个Field都保存一个FSTIndex来帮助快速定位tim文件中属于这个Field的Term的位置,由于FSTIndex的长度不同,为了快速定位某个Field的位置,则应用指针列表规则,为每一个Field保存了指向这个Field的FSTIndex的指针。

这里比较令人困惑的一点就是,FST是什么,如何利用他来分块呢?

FST全程是Finite State Transducers,是一个带输出的有限状态机,看过前面有限状态机规则的可以知道,有限状态机逻辑上来讲就是一颗树,就像图3-71中的那棵树,从初始状态输入字符a到达状态a,输入字符b到达状态b,输入字符d到达状态d,不同的是状态d有输出,所谓的输出就是一个指针,指向tim文件中的位置。

Tim文件中Term的分块就是按照FST来的,图3-71中,Block 0中的所有的Term都是以abd为前缀的,Block 1中所有的Term都是以abe为前缀的。每一个Block都有一个Block Header,里面指明这个Block包含几个Term,假设个数为N,Suffix里面包含了N个后缀,比如Block 0中包含Term “abdi”和”abdj”,则这里面保存”i”和”j”。Stats里面包含了N个统计信息,每个统计信息包含docFreq和totalTermFreq。Metadata里面包含了指向倒排表文件frq和prx文件的指针。

下面咱们具体讨论,Term如何分块,Block如何写入,FSTIndex如何构造。

我们首先通过一个简单的例子,来看一下一个普通的FST是如何构造的,Lucene的文档里面给了类似下面这样一个例子。

这里InputValues是构造FST的输入,是根据这些字符串,构造出图3-71中的那棵树。

OutputValue是有限状态机的输出,由于在实际应用中,输出是一个指向tim文件的一个指针,一般是byte[]类型,所以我们也在这里弄了三个byte[]作为输出。

Builder就是有限状态机的构造器,它支持多种输出类型,我们这里用byte[]作为输出,所以输出类型我们选择BytesRef,这是对byte[]的一个封装。

下一步就是用Builder的add函数将输入和输出关联起来,由于builder的输入必须是IntsRef类型,所以需要从字符串转换成为IntsRef类型,输出也要将byte[]封装为BytesRef。

Builder的finish函数真正构造一个FST,在内存中形成一个二进制结构,通过它可以通过输入,快速查询输出,例如程序中的给出输入”acf”就能得到输出[5 6]。

从表面现象来看,我们甚至可以决定FST就是一个hash map,给出输入,得到输出。这就满足了作为Term Dictionary的要求,给出一个字符串,我马上能找到倒排表的位置。

下面是FST的序列化:关心底层存储可以了解下。

依次类推,当添加acf之后,frontier变成如下的数据结构。

形成的二进制数组如图3-75所示,由于有内容翻转,所以解析的时候需要从右向左解析。

默认情况下,BlockTreeTermsWriter有两个静态变量,DEFAULT_MIN_BLOCK_SIZE=25,DEFAULT_MAX_BLOCK_SIZE=48,MIN的意思是当某个状态节点的子节点个数超过25个的时候,可以写成一个Block,MAX的意思是当个数超过48的时候,则写成多个Block,多个Block构成一个层级Block。为了能够清晰的解析代码,我们设DEFAULT_MIN_BLOCK_SIZE=2,DEFAULT_MAX_BLOCK_SIZE=4。我们仅仅添加一篇文档,里面的Term依次为 abc abdf abdg abdh abei abej abek abel abem aben。所形成的状态树如图所示,根据MIN和MAX的设置,f, g, h会写成一个Block,i, j, k, l, m, n写成一个层级Block,c, d, e写成一个Block。

最终,tip和tim文件中Block和FSTIndex的格式和关系如图3-83所示。

最后我们再看一下FSTIndex的二进制内容,如下图3-84所示。

转载于:https://www.cnblogs.com/bonelee/p/6626984.html

Lucene 4.X 倒排索引原理与实现: (3) Term Dictionary和Index文件 (FST详细解析)——直接看例子就明白了!!!...相关推荐

  1. Lucene 倒排索引原理

    1 前言 Lucene 作为 Apache 开源的一款搜索工具,一直以来是实现搜索功能的神兵利器,现今火热的 Solr 和 Elasticsearch 均基于该工具包进行开发,我们搜索召回组这边也是基 ...

  2. python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...

    关于倒排索引 搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档.怎么快速找到包含某个关键词的文档就成为搜索的关键.这里我们借助单词--文档矩阵模型,通过这个模型我们可以很方便知道某篇文档 ...

  3. 倒排索引 java_倒排索引原理和实现

    关于倒排索引 搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档. 怎么快速找到包含某个关键词的文档就成为搜索的关键.这里我们借助单词--文档矩阵模型, 通过这个模型我们可以很方便知道某篇 ...

  4. Lucene中倒排索引原理

    1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引 ...

  5. 深度解析 Lucene 轻量级全文索引实现原理

    作者:vivo互联网服务器团队-Qian Yulun 一.Lucene简介 1.1 Lucene是什么? Lucene是Apache基金会jakarta项目组的一个子项目: Lucene是一个开放源码 ...

  6. 【Elasticsearch】倒排索引原理

    1.概述 转载:elasticsearch 倒排索引原理 本文写的不错. 网上看到的一篇文章,对Lucene的倒排索引是如何执行的,说的比较易懂,就转过来分享下. Elasticsearch是通过Lu ...

  7. ElasticSearch倒排索引原理 数据的写入与查询过程

    Elasticsearch在生产中充当的角色 业务上,最早启用Elasticsearch(下称ES)是为了解决模糊查询的问题.具体业务场景为大量抓取回来的短视频内容.热门微博.公众号文章.小红书笔记. ...

  8. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索 ...

  9. 倒排索引原理,即为什么叫倒排索引

    倒排索引的英文原名是Inverted index,大概因为Invert有颠倒的意思,所以就被翻译成了倒排,然后我们就会在字面上出现误解:理解为从A-Z颠倒成Z-A.其实它并不是字面上的意思. 倒排索引 ...

最新文章

  1. 985硕博导师:如果你没空看书,我强烈建议你做这件事
  2. 根据ip获取用户地址-百度
  3. 新款iPhone,比绿更绿
  4. 单曲循环 翻译_歌单 | 单曲循环amp;热评
  5. php 匹配图片路径_php正则匹配图片路径原理与方法
  6. 因变量 方差膨胀系数_请问如何计算潜变量的方差膨胀因子(VIF)?
  7. 如何在路由器的局域网下使用IIS发布网页
  8. Mac软件损坏,无法打开,允许任何来源后依旧损坏
  9. python文件IO中的二进制格式与文本格式
  10. Open Database causes ORA-600: kcratr_scan_lastbwr
  11. HTML图片跟随鼠标移动代码,网页怎么实现图片跟随鼠标移动
  12. js利用CLodop实现打印功能
  13. IAST 被动扫描 WebGoat
  14. 柯美smb扫描出现服务器连接错误_柯尼卡美能达smb扫描设置方法是什么
  15. mybatis-plus 多条件下关键字查询
  16. java中:统计字符串大串中小串出现的次数,代码实现
  17. Navicat批量修改数据库某一属性初始值
  18. android闹钟小案例之知识点总结
  19. 目标跟踪算法综述与分析
  20. exhentai服务器不稳定,Exhentai的正确打开方式(以Chrome浏览器为例)

热门文章

  1. 制作模板_木模板制作流程
  2. mongo里的type_MongoDB $type 操作符
  3. python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?
  4. android应用程序开发_Kotlin与Flutter:Android跨平台应用程序开发,到底选择哪个?...
  5. java开发的增查改删_在Java中实现增、删、改、查功能?
  6. csgo国服文件转国际服务器,csgo国际服怎么转国服 csgo国际服转到国服方法介绍...
  7. 长沙医学院计算机系怎么样,长沙医学院有哪些专业及什么专业好
  8. 【深度学习】基于Torch的Python开源机器学习库PyTorch卷积神经网络
  9. 【微信小程序企业级开发教程】如何搭建服务器(tomcat)后台
  10. 【Network Security!】Linux中apt-get update和apt-get upgrade命令的区别