Lucene4.3开发之第九步之渡劫中期(九)

下图是一个典型的Lucene4.X的索引结构图:

Lucene4.x之后的所有索引格式如下:

复合索引文件是指,除了段信息文件,锁文件,以及删除的文件外,其他的一些列索引文件压缩一个后缀名为cfs的文件,意思,就是所有的索引文件会被存储成一个单例的Directory,而非复合索引是灵活的,可以单独的访问某几个索引文件,而复合索引文件啧不可以,因为其压缩成一个文件,所以在某些场景下能够获取更高的效率,比如说,查询频繁,而不经常更新的需求,就很适合这种索引格式。

lucene索引的基本概念组成有,索引、文档、域和项组成,一个索引,通常包含一些序列的文档,一个文档(doc)包含一些序列的域(field),而一些域有包含一些序列的项,而一些项则包含一些序列最底层的字节,注意这里的序列指的是在索引结构中有序,通常有序的这种格式,某些情况下可以优化索引的结构。

lucene使用了倒排索引(Inverted Indexing),来存储索引信息,大大提高了索引效率。

倒排索引,举一个通俗的例子,原来基于人们的正常思维,我们会存储的是一个文章中出现了那几个单词,而倒排索引,却恰恰相反,它存储的是这个单词,包含在几个文档中,当然这个关系是由倒排链表(存储一些列docid)构成的索引,我们在检索时,通过这个单词可以快速定位,他出现在几篇文章中,从而大大提升了检索的性能。

当然lucene中不仅仅有倒排索引,也有正向的存储,而倒排之所以是lucene的核心,是因为它提升了检索的性能,在检索到一个个具体的文档时,就需要我们正向的拿出这些信息,反映在实际的代码中就是我们通过检索获取的一个个docid,然后通过一个个docid获取整个文档,然后我们在正向的获取各个域,以及各个项存储的具体信息,当然前提是你存储了这个字段,如果你只是索引而没有存储,那么你只能检索到此条信息,但无法获取具体的term的值,这个需要在建索引之前就要设计好,索引的存储结构,哪些字段是检索的,哪些字段是存储的等等,如果你还需要高亮一些内容,则还需要存储这个域的偏移的位置,通过这样就能准确的在文中标记检索名中的关键词,如果你打算在前台来完成这个高亮,就不要存储这些信息了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java——20171121

!(http://a.51jsoft.com/uploads/default/original/1X/c542896b094a42a5653fb75adf6cdacd6e35d12e.png)!(https://static.oschina.net/uploads/space/2017/1121/210719_G80Z_3715033.png)

Lucene4.3开发之第九步之渡劫中期(九) - HelloWorld