Lucene 4.0 正式版发布,亮点特性中文解读[转]
http://blog.csdn.net/accesine960/article/details/8066877
2012年10月12日,Lucene 4.0正式发布了(点击这里下载最新版),这个版本因为诸多的新特性和大胆的架构调整一直备受期待。无论是索引结构,索引算法以及整体架构的包容性都发生了翻天覆地的变化。正如大家一直所说的Lucene是一个搜索工具包 ,而4.0的发布则让Lucene向搜索框架的方向迈出了一大步。 下面我们来逐一解读Lucene 4.0的新特性吧。
Lucene 4.0 的关键词:
架构解耦,索引结构可定制化,索引结构透明化,向搜索框架方向发展。
Lucene 4.0 正式版亮点功能:
一、通过解码器Codec 机制 Lucene 索引格式与Lucene架构解耦,变成了Plugin方式实现,包括:Terms , Postings lists ,Stored 字段,Term Vectors 等都可以以自定义的格式予以支持。
正如Mysql支持多种存储引擎一样,现在Lucene也可以了。
二、排序相关的算法与向量空间模型解耦(即Lucene中经典的经典的(TF/IDF)模型)。同时提供:最佳匹配 Okapi BM 25,随机分歧 (Divergence from Randomness ),语言模型和基于信息量的模型。 不同的算法模型可以组合串联起来使用,这等于完全解放了Lucene的生产力!。
三、新的DocValues类型可以为每个文档提供存储额外的类型数据。类似:PayLoad, 可以在用这个特性自定义排序打分参数。
四、IndexWriter 写入索引到硬盘支持完全并发,之前IndexWriter在应用层能多线程调用,但在写入硬盘的时候还是逐个线程顺序写入的。这对于经常要重建索引的场景,减少了等待索引的时间。
具体图形化的演示,请参考我之前的一片文章: http://blog.csdn.net/accesine960/article/details/6780068
五、每个Document的标准化因子 norms 不再局限于一个字节。自定义排序的实现可以使用任何DocValues类型的排序因子。
六、索引结构更加透明化,增加了索引统计机制,利用这些统计信息,Lucene索引内容不再是一个黑匣子了。
包括: 提供针对term或者Field的token数量,针对某个filed的Posting数量,包含某个field的positing的文档数量。当然有了这些索引统计的数据后,就可以自定义的改进评分机制了。
也就是说以下方法将会成为你的新朋友:
TermsEnum.docFreq(),TermsEnum.totalTermFreq(),Fields.getUniqueTermCount(),Fields.getUniqueFieldCount()
七、索引term不再局限于UTF-16的字符格式,Lucene 4.0中 term 可以是任何二进制数值(java中的byte数组)。默认情况下文本类term是UTF-8字节方式存储。
八、在搜索时使用Filter效率有大幅提升
九、针对索引merge线程添加了IO限速机制,减少搜索线程与合并索引线程引起的IO争用现象。
十、由于架构的解耦,增加了一系列可插拔和可替换的模块,包括:
A: 添加编码器codec:针对类 Hadoop DFS 的文件系统提供。
B: 内存编码器codec:把所有的term和posting放到一个内存中的FST(有限状态机),针对内存型应用提升了搜索速度。
C: 脉冲编码器codec:主要利用了 Zipf 定律,根据term的频率,把频率达到制定阈值的term以inline的方式存储。
了解c++ inline 函数的同学,应该知道inline对于提升函数调用速度的威力吧。
D: 明文编码器codec: Lucene的索引结构为了提升效率,从来都是一个黑匣子。现在这个黑匣子可以以明文的方式存储了。
很显然这个编码器主要是调试、演示用的。估计很多需要写论文的同学们很乐意使用这个功能。
E: Bloom编码器codec: 国内很多人把Bloom翻译为布隆,我还是喜欢直接用英文的Bloom。
关于什么是Bloom 参考我之前的一片文章:http://blog.csdn.net/accesine960/article/details/1491483
F:直接编码器 codec : 由这个名字可以看到,这个编码器是为提升效率用的,主要针对高内存需求类的场景定制的。
G: 块解码器 codec: 使用了一个新的索引结构和压缩模式schema。
十一、Term 偏移量可以选择与Postings list存储在一起。
十二、新增AutomatonQuery ,用来返回所有Term匹配有限状态机文章列表
十三、FuzzyQuery 查询速度提升了100-200倍。
十四、新增拼写检查器DirectSpellChecker,新的拼写检查器不需要单独的索引,能够直接使用主索引。
十五、 运行中的内存数据结构优化,包括:term 目录,FiledCache 等。
以:500万wekipedia数据为例 3.x 索引时需要600M内存,4.x 索引时需要 200M内存。
十六、所有的搜索逻辑现在针对每个segment上工作。IndexReaer 也被完全重构,变成了:Atomic 和 Composite Reader。
这个变化比较大,我们知道Lucene在生成索引的时候会先生成小的Segment然后逐渐合并成大的Segment。Lucene的所有结构和组件都是以多个Segment为导向进行设计架构的。为搜索多个Segment需要MultiReader,而多Reader的会导致在搜索TermEnum 或者 Postings 的时候搜索效率的下降。因此新的Reader去掉了MultiReader,以Atomic和Composite Reader 代替。
十七、Lucene 4.0 提供了模块化的API。 以模块化的方式提供了非结构化信息管理分析器 和 空间信息搜索模块。
相关参考:
http://www.lucidimagination.com/blog/2011/09/12/flexible-ranking-in-lucene-4
http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html
http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.html
http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.html
http://blog.mikemccandless.com/2011/06/primary-key-lookups-are-28x-faster-with.html
http://blog.mikemccandless.com/2010/06/lucenes-pulsingcodec-on-primary-key.html
http://blog.mikemccandless.com/2010/10/lucenes-simpletext-codec.html
http://www.slideshare.net/otisg/finite-state-queries-in-lucene
http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html
http://blog.mikemccandless.com/2010/07/lucenes-ram-usage-for-searching.html
http://blog.thetaphi.de/2012/02/is-your-indexreader-atomic-major.html
Lucene 4.0 正式版发布,亮点特性中文解读[转]的更多相关文章
- Python 3.8.0 正式版发布,新特性初体验 全面介绍
Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...
- Redis 3.0正式版发布,正式支持Redis集群
Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...
- .NET Core 3.0正式版发布
是的,.NET Core 3.0正式版发布了,令人兴奋. WPF 其实,.NET Core 2.1开始已经是个很完善的版本,3.0又带来了什么呢?我站在我的使用角度来看,最最令人振奋的就是:能用WPF ...
- Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
开发四年只会写业务代码,分布式高并发都不会还做程序员? Nest.js 6.0.0 正式版发布了.Nest 是构建高效.可扩展的 Node.js Web 应用程序的框架.它使用现代的 JavaSc ...
- Appium路线图及1.0正式版发布
Appium更新的速度极快,从我试用时候的0.12到1.0(0.18版本后就是1.0),完全符合移动互联网的节奏. 更新可能会慢,可以多试几次 整理了testerhome上思寒发表的帖子,让我们来看下 ...
- RestServer 2.0 正式版发布
RestServer 2.0 正式版发布 使用许可&版权说明 在保持本软件完整的情况下可以将本软件用于任何商业用途. 本软件可以自由传播,但是请保持软件相关文件和说明文档完整. 未经许可不得将 ...
- React Suite v3.0 正式版发布
React Suite v3.0 正式版发布 相信很多人会好奇,React Suite 是什么? React Suite 是 HYPERS 前端团队和 UX 团队开源的一套基于 React 的 UI ...
- Xcode 7.0正式版发布了
Xcode 7.0正式版发布了 下载地址:链接: http://pan.baidu.com/s/1FNkPS 密码: ee42 本文由大学霸整理,转载请注明出处,尊重IT人!
- RapidJSON 1.0 正式版发布,C++的JSON开发包
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
随机推荐
- Vue.js学习使用心得(一)
一.初步了解 Vue.js是一套构建用户界面的渐进式框架,它只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,相当于JavaS ...
- hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)
#include <bits/stdc++.h> using namespace std; ; struct T { int to; int w; }; vector < vecto ...
- Thread sleep() wait()
学艺不精,先总结一下两者的区别: 对比项 wait sleep 类所属 Object Thread,static方法 使用 在synchronised block中(包括notify,notifyAl ...
- java-抽象类的成员特点
1.成员变量:既可以是变量,也可以是常量.abstract不能修饰成员变量. 2.构造方法:有.用于子类访问父类数据的初始化. 3.成员方法:既可以是抽象的,也可以是非抽象的. - 抽象方法:强制要求 ...
- java-权限修饰符的区别
说明:所谓访问权限,是指对象是否可以通过“.”运算符操作自己的变量或通过“.”运算符使用类中的方法. 1.Java中的四种访问修饰符:public.protected.default(无修饰符,默认) ...
- mvc core2.1 Identity.EntityFramework Core 配置 (一)
https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/customize_identity_model?view=a ...
- PS学习之如何把小姐姐塞进瓶子里
准备素材 开始制作 用PS新建一个国际通用纸张大小的画布 分辨率可以调为72 改变背景色 插入图片 水平居中对齐 插入木质素材 放大 覆盖之前的素材 调整图层顺序 创建剪切蒙版 对木桩添加曲线 设置立 ...
- nginx启动重启与升级以及检测配置文件
查看nginx的主进程号 ps -ef|grep nginx 从容停止nginx kill - QUIT nginx主进程号 或者 kill - QUIT nginx的pid文件所在,例如我的 [ro ...
- c的动态内存管理
在linux系统下使用malloc提示警告,解决方法,加入头文件<stdlib.h> 首先来个基本的例子 int *p=(int *)malloc(sizeof(int));(当mallo ...
- nginx unit nodejs 模块试用(续)
最新(应该是18 年了)nginx unit 发布了新的版本,对于nodejs 的支持有很大的改进,上次测试过,问题还是 比较多,这次使用新版本在测试下对于nodejs 的支持,以及以前block ...