[Lucene高性能] Lucene中分组统计(GroupBy)及去重(Distinct)性能在数量级上提升解决方案

所谓分组统计,就是类似sql里group by的功能。在solr里,这个功能称为faceting。lucene本身不支持分组统计,不过可以使用fieldCache来实现分组统计功能,而且也有很好的性能。solr根据不同的情况,还提供了其他方法(filterCache和 UnInvertedField ) 来实现,这个以后再说。

fieldCache是lucene用来排序的缓存。对要用来排序的字段,lucene会从索引中将每篇文档该字段的值都读出来,放到一个大小为maxDoc的数组中。maxDoc是lucene内部文档编号的最大值。有两点需要注意一下:
  • fieldCache中的字段值是从倒排表中读出来的,而不是从索引文件中存储的字段值,所以排序的字段必须是为设为索引字段
  • 用来排序的字段在索引的时候不能拆分(tokenized),因为fieldCache数组中,每个文档只对应一个字段值,拆分的话,cache中只会保存在词典中靠后的值。
fieldcache是lucene最占用的内存的部分,大部分内存溢出的错误都是由它而起,需要特别注意。

分组统计可以借用fieldCache来高效率的实现。调用lucene进行查询,通过读取倒排表并进行boolean运算,得到一个满足条件的文档的集合。通过每个结果文档号读取fieldCache数组中的值,并分不同的值累加数目,即可实现分组统计的功能。其中,如果某个字段对应多值,则在索引的时候不拆分,从filedCache数组读出后,再进行拆分统计。
 

补充:StringIndex有两个属性:lookup、order

string[] lookup:按照字典顺序排列的所有term

int[] order:  其中位置表中文档号,order[i]表示第i个document某个field包含的term在lookup中的位置

获取docid对应的term的值:termValue = lookup[order[doc]]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lucene 是一种开源的全文搜索引擎库,虽然它已经具备了很好的性能,但在处理海量数据时,还需要进行一些性能优化的工作。以下是一些优化技巧: 1. 建立索引:建立合适的索引结构对于搜索性能至关重要。可以通过调整分词器、字段类型等参数来优化索引的构建过程。 2. 使用缓存:Lucene 提供了一些缓存机制,可以缓存频繁使用的结果,例如过滤器缓存、排序缓存等。合理利用缓存可以减少磁盘 I/O 操作,提升搜索效率。 3. 硬件优化:在硬件方面,可以使用更高性能的硬盘、增加内存等方式来提高 Lucene性能。特别是加大文件系统缓存可以加快索引和搜索的速度。 4. 查询性能优化:可以通过使用合适的搜索技术(如布尔查询、短语查询等)、调整查询权重、优化查询语句等方式来提高搜索效率。 5. 批量操作:对于大规模数据的操作,可以尽量使用批量操作方式,减少频繁的单条数据操作,以提高效率。比如通过批量提交文档,批量删除文档等方式。 6. 关键词匹配优化:对于一些特定的场景,可以通过使用同义词字典、拼写纠错、文分词等方式来优化关键词的匹配,提高搜索的准确性。 7. 数据分片:对于大规模数据,可以将索引数据分片存储在多台机器上,通过分布式的方式来提高搜索的并发能力和吞吐量。 总的来说,lucene 性能优化涉及多个方面,包括索引构建、查询优化、硬件优化、批量操作等,需要根据具体应用场景和需求来选择合适的优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值