转自:http://blog.csdn.net/whuqin

本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息。基于Lucene 4.10.0。

数据结构

索引(index)包含了存储的文档(document)正排、倒排信息,用于文本搜索。索引又分为多个段(segments),每个新添加的doc都会存到一个新segment中,不同的segments又会合并成一个segment。segment存储着具体的documents,每个doc有一系列的字段(field)组成,一个field的值是多个词(term),一个term是以一些bytes。其递进关系如下: 
index -> segments -> documents -> fields -> terms

文件介绍

全局性文件

segments_N: 记录索引的段数、各段名、各段中文档数、删除数和更新数。可能有多个segments_N文件,最大N的segments_N是有效文件。 
segments.gen: 记录当前index的代数(generation),即segments_N的最大N 
write.log:阻止多个IndexWriter同时修改索引,一次只能有一个IndexWriter

段文件

  • 段描述 
    xxx.si: 段的元数据,如此段的文档数及相关文件 
    xxx.del:删除的doc
  • field信息 
    xxx.fnm:field names,field名称、索引方式 
    xxx.fdx:field index,索引xxx.fdt 
    xxx.fdt:field data,存储stored fields
  • term信息 
    xxx.tip:term index,xxx.tim的索引,实现对xxx.tim的随机存取 
    xxx.tim:term dictionary,按字典顺序排列的terms,其值指向.doc/.pos 
    xxx.doc:倒排列表,term所在的docs、在doc中的频率 
    xxx.pos:倒排列表,term在doc中的位置 
    xxx.pay:payloads and offsets,term在doc中的offset 
    注意:term的位置及频率都是在某doc下term在field中的位置和偏移,位置以切词为单位,偏移以字符为单位
  • term vector 
    term vector用于打分,存储StoreTermVectors的field 
    xxx.tvx:term vector index,每个doc在xx.tvd、xx.tvf中的位置 
    xxx.tvd:term vector data file,每个doc的term vector field信息在xxx.tvf中的位置 
    xxx.tvf:term vector fields,field的term列表及各term的频率、位置或者偏移
  • 归一化 
    lucene为doc算分时根据各doc中的term weight(term对doc的重要性),但是不同的doc重要性不同、不同的field重要性不同、不同的文档长度也不同,要想让不同文档的term weight之间有可比性(打分有可比性)需要进行归一化。用于归一化的因子(normalization factors),如doc和field的boost factor及长度,存在如下文件中。 
    xxx.nvm:norms metadata 
    xxx.nvd:norms data
  • doc values 
    存储DocValues类型的field,通过field value可以获取对应的doc number列表, 便于进行一些概括或者打分。类型为docvalue的field在doc不能重名。 
    xxx.dvm:DocValues metadata 
    xxx.dvd:DocValues data

总结

从上节可以看出 正排信息存储在:段(segments_N) -> field (.fnm/.fdx/.fdt) -> term (./tvx/.tvd/.tvf) 
倒排信息存储在:词典(.tim) ->倒排表(.doc/.pos) 

参考见: 
https://lucene.apache.org/core/4_10_0/core/org/apache/lucene/codecs/lucene410/package-summary.html#package_description 
https://lucene.apache.org/core/3_0_3/fileformats.html 
http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html

lucene索引文件格式的更多相关文章

  1. Lucene学习总结之四:Lucene索引过程分析

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

  2. Lucene学习总结之四:Lucene索引过程分析 2014-06-25 14:18 884人阅读 评论(0) 收藏

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

  3. lucene学习笔记:三,Lucene的索引文件格式

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  4. Lucene学习总结之三:Lucene的索引文件格式(1)

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  5. Lucene学习之四:Lucene的索引文件格式(2)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623599.html  略有删减和补充 四.具体格式 上面曾经交代过,L ...

  6. Lucene学习之四:Lucene的索引文件格式(1)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html Lucene的索引里面存了些什么,如何存放的,也即 ...

  7. Lucene学习总结之三:Lucene的索引文件格式(1) 2014-06-25 14:15 1124人阅读 评论(0) 收藏

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  8. Lucene学习之四:Lucene的索引文件格式(3)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html ,略有删改和备注. 四.具体格式 4.2. 反向信 ...

  9. Lucene学习笔记: 四,Lucene索引过程分析

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

随机推荐

  1. fzu 1015 土地划分(判断线段相交+求出交点+找规律)

    链接:http://acm.fzu.edu.cn/problem.php?pid=1015  Problem 1015 土地划分 Accept: 714    Submit: 1675Time Lim ...

  2. 几个移动App测试工具

    介绍几款移动App测试的工具: 腾讯测试:http://bugly.qq.com/优测:http://utest.qq.com/fir.im测试:http://bughd.com/ 大致介绍如下: b ...

  3. Memcached通用类(基于Memcached Client Library)

    分享下自己编写的Memcached通用类.欢迎大家帮忙指点下哈~ 使用的是.NET memcached client library 客户端+Memcached Providers using Sys ...

  4. iOS - UITabBarController

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController <UITabBarDelegate ...

  5. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  6. C#_数据库连接串的配置

    数据库的连接串 数据库连接字符串的拼写规则的决定条件: 连接的数据库的类型:SQL Server,Oracle,MySQL,Acess,MogoDB,Visual FoxPro(dBASE),Exce ...

  7. python语法笔记(二)

    1. 循环对象 循环对象是一类特殊的对象,它包含一个next()方法(在python3中是 __next__()方法),该方法的目的是进行到下一个结果,而在结束一系列结果之后,举出 StopItera ...

  8. 解析excel表格为DataSet

    using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System ...

  9. sql raiseerror

    raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ]   其语法如下: RAISERROR ( { msg_id | msg ...

  10. Lua中点和冒号的区别

    在使用lua设计类时'.'和':'的区别主要在于使用'.'必须手动加self参数,使用':',可以隐藏这个参数,使用'.'调用使用':'定义的函数时,要注意,函数的第一个参数为self,如 funct ...