lucene 4.X 中的域缓存(FieldCache)和DocValue

Lucene在3.0提出了域缓存(FieldCache)的概念,这个API主要是在内部使用,但开发者也可以外部调用,在自定义排序或者自定义评分的时候都涉及到相关的接口。准确的说,就是将相关的域的值加载到内存中,形成一维数组。加载域缓存,并不要求相关域的值必须在索引中store,而是要求必须Index,并且不能分词,实际上域缓存的值是从倒排索引中转换而来。具体原理见下图

在lucene3.0中域缓存的API调用如下

针对字符域

FieldCache.DEFAULT.getStrings(reader, field);

针对数值域,比如Float类型

FieldCache.DEFAULT.getFloats(reader, field)

域缓存有两项不足

1. 常驻内存,大小是所有文档个数 * 值类型大小 
2. 初始加载过程耗时,需要遍历倒排索引及类型转换

Lucene自4.0起提出了一个新的概念DocValue,允许用户在建索引的时候将相关域的文档id和域的value之间的影射直接保存在索引文件中。这也就意味着,用户需要在建立索引的时候,建立一种父类为DocValueField的特殊域,DocValueField有各种子域,关于DocValue,我们另写文章来谈。

因此,在lucene4.0中,Lucene在使用域缓存时,首先会去取对应的docValueField的值,然后再根据相关的doc id去随机获取域的值。如果docValueField并不存在,才会从倒排索引中进行类型转换,再加载到内存中,这是3.0中的机制。也就是说,默认会使用docValue代替域缓存。具体见代码

事实上,查了一下,在lucene6.0的API中,FieldCache已经被取消了。

 

转载于:https://my.oschina.net/nickname/blog/715138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值