Lucene/Solr Optimize相关总结

简介: 假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。

Optimize就是优化的意思。说到Optimize,其实问题回归到两个本质问题:updata-in-place/update-out-of-placerestart

1 When Optimize
索引updatedeletedaddupdatedeletedadd反反复复,导致索引千仓百孔指针琳琳散散无用数据或者辅助数据增多,最后影响相同的查询逻辑,越到后面检索性能逐渐糟糕。

2 How Optimize
整体optimize、局部optimize、混合optimize

整体optimize,就是对已经存在的索引,整体optimize下,本质就是基于原来索引进行索引重建。这个过程减少了文本IO、文本分析等开销。据经验对于一个个文本文件从磁盘建索引:建完后优化大约=1:0.6.也即基于索引构建索引二次构建时间开销大概是原来从文本构建的0.6. 这个数据规模5000w。超过5000w的可能优化比一定比原始重建省时,反而时间更长。 Lucene/solr 直接由现成的接口indexWriter.optimize(),调用下就可以了。
在最新的3.4 以后,不建议使用optimize,因为这个太耗时了。所以,在接下来的优化中,会逐步优化增量机制,平衡性能和索引规模下时间开销的。

句部optimize,就是对数据先分区(多个子应用),分区下再分组(多个hash分布),二级分组。这样可以对分区内优化、分组内优化、二级组内优化。这样通过降低规模来实现性能和时间平衡。Lucene2.9.1solr1.4以及以后版本,支持mergePolicy插件化,这样继承默认的policy,然后IndexWriterset新的policy,就可以针对segment或多目录索引进行局部optimize

混合optimize,就是整体和局部都执行。这种情况下,整体的频率降低,局部的频率较高。从而实现阶段性的性能最佳。例如一个月一次整体optimize,每天局部optimize,这样可以保证在性能快要出现下滑时,及时restart到最佳性能点。

3 what optimize
索引optimize本质就是索引重建。如何最大程度大块大块利用之前的索引,将大大改进optimize性能。对应lucene默认的optimize来说,文本读取IO、文本分析时间将免去或者这部分开销大大降低。optimize另外一个本质就是restartoptimize就是业务逻辑的回归,有点类似垃圾回收后,内存有空间连续块。optimize之后,指针、存储变得更加紧蹙、高效。在lucenemergePolicy决定对那些segment合并,或者满足什么属于的segment合并。而合并算法的本质是基于堆排序重新renew 索引。

Lucene/solr
默认调参无法满足需求时,开始扩展mergePolicy,此时仍然无法满足需求,需要扣memory了。
memory:(1) 对象复用。对大批量、单一流向的操作来说,重用对象将大大降低堆内存消耗,减少ygclucene/solr3.4以及以后版本,已经重用documentfield对象,批量操作性能更好。
(2)
重用 待优化索引的大块对象或者大块数据,从而降低重复计算开销。这块的优化涉及lucene 合并算法。
重度复用的话,需要定做一些数据结构,例如,postlist的块独立化。这方面可以参考“wangsou”,详情不变透露!
(3)
调整基础cache大小,做到与os pagecache同步或者改变os pagecache策略。这个问题属于定制index下的os,除了googlebaidusousousogou等大牛已经执行了,其他公司由于业务特性,都很少去优化os这一层。

4 notice
(1)
第一次文本建索引属于IOCPU密集性应用,OptimizeIO密度降低、CPU密度提升。Optimize过程中IO次数尽管少了,memory消耗增多,但是关联的文件数据大小更大。需要平衡大文件颠簸MemoryDISK开销。
(2)Mutithread
多路归并,需要较好的硬件支持。
(3)
尽量不要动用optimize,从业务上着手优化性能

目录
相关文章
|
SQL 存储 分布式计算
MaxCompute元数据使用实践--项目信息统计
MaxCompute的租户级别Information Schema从租户角度提供项目元数据及使用历史数据等信息,您可以一次性拉取您同一个元数据中心下所有Project的某类元数据,从而进行各类元数据的统计分析。
1211 1
|
存储 前端开发 Java
理解编程语言的严格和惰性计算
【7月更文挑战第13天】本文介绍惰性计算推迟了表达式求值,直到其值真正需要时才执行,从而优化性能,节省资源。在前端和并发编程中,懒加载和类似技术结合函数式编程特性,如 continuations,平衡了抽象与性能。
329 4
理解编程语言的严格和惰性计算
|
11月前
|
存储 SQL 分布式计算
大数据时代的引擎:大数据架构随记
大数据架构通常分为四层:数据采集层、数据存储层、数据计算层和数据应用层。数据采集层负责从各种源采集、清洗和转换数据,常用技术包括Flume、Sqoop和Logstash+Filebeat。数据存储层管理数据的持久性和组织,常用技术有Hadoop HDFS、HBase和Elasticsearch。数据计算层处理大规模数据集,支持离线和在线计算,如Spark SQL、Flink等。数据应用层将结果可视化或提供给第三方应用,常用工具为Tableau、Zeppelin和Superset。
4614 8
|
移动开发 小程序 测试技术
自定义多级联动选择器指南(uni-app)
在本文中,探讨了如何在uni-app中创建自定义多级联动选择器组件。这个组件具有强大的多端支持,可适用于H5、APP、微信小程序、支付宝小程序等多种平台。
1052 1
自定义多级联动选择器指南(uni-app)
|
XML IDE 前端开发
IDEA忽略node_modules减少内存消耗,提升索引速度
在后端开发中,IDEA 在运行前端代码时,频繁扫描 `node_modules` 文件夹会导致高内存消耗和慢索引速度,甚至可能会导致软件卡死。为了改善这一问题,可以按照以下步骤将 `node_modules` 文件夹设为忽略:通过状态菜单右键排除该文件夹、在设置选项中将其加入忽略列表,并且手动修改项目的 `.iml` 文件以添加排除配置。这些操作可以有效提高IDE的运行性能、减少内存占用并简化项目结构,但需要注意的是,排除后将无法对该文件夹进行索引,操作文件时需谨慎。
1217 4
IDEA忽略node_modules减少内存消耗,提升索引速度
|
Java C++
做了个Java打包工具,可以双击启动了!
本文介绍了作者日常使用Java和Swing进行开发的经验,以及Java程序分发时遇到的问题,如需要JRE环境。文中列举了几种常见的Java程序打包方法,并对比了各自的优缺点,最后作者结合这些方案,利用Winform开发了一款工具,将Java程序打包成二进制可执行文件,简化了分发流程。
做了个Java打包工具,可以双击启动了!
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
412 1
|
存储 安全 关系型数据库
FileZilla Server提权与常见问题
FileZilla Server提权与常见问题
1035 0
|
存储 缓存 安全
Python教程:深入理解 Python 字典(Dict)
Python 中的字典(Dictionary)是一种非常重要的数据结构,它提供了灵活的键值对存储方式,适用于各种实际编程场景。本文将带领您探索 Python 字典的全貌,从基础概念到高级应用,让您全面了解并熟练运用 Python 字典。
469 3
|
存储 Oracle 关系型数据库
实时计算 Flink版操作报错之遇到Caused by: java.sql.SQLException: ORA-44609: CONTINOUS_MINE,该怎么处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。