Lucene优化(索引库存放位置选择) | 学习笔记

简介: 快速学习Lucene优化(索引库存放位置选择)。

开发者学堂课程【Lucene知识精讲与实战(下)Lucene优化(索引库存放位置选择)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/701/detail/12355


Lucene优化(索引库存放位置选择)

 

内容介绍:

一、选择合适的位置存放索引库

二、搜索api的选择

 

一、选择合适的位置存放索引库

1、lucene优化中讲索引库的位置,存放在哪通过存放的位置提高查询以及创建索引的速度,列举索引库存放位置的对象有三个。

写操作

读操作

特点

SimpleFSDirectory

java.io.RandomAccessFile

java.io.RandomAccessFile

简单实现,并发能力差

NIOFSDirectory

java.nio.FileChannel

FSDirectory.FSIndexOutput

并发能力强, windows平台下有重大bug

MMapDirectory

内存映射

FSDirectory.FSIndexOutput

读取操作基于内存

创建索引库时,制定索引库的位置,使用的是 FSDirectory 对象,FS file systems 文件系统,存到文件系统中就是存到硬盘中,着重讲 MMapDirectoryFSDirectory 不管是创建索引和文档文件,还是从指定的目录中查询出文档文件和索引文件的内容,都是通过操作硬盘,把硬盘中的拿过来,或者写入硬盘中,  MMapDirectory 写的时候是内存映射,读的时候,里面是有缓存的,而对于FSDirectory 里面只是通过硬盘操作,没有内存参与,而 MMapDirectory 有内存参与,写的时候是往硬盘里面写,第一次查询时是从硬盘中查,把查询出的数据,加载到内存中,第二次查就直接从内存中查,查询速度要比直接从硬盘中查要快的多。

2、没有优化情况下,小100万条数据,创建索引需要7725ms,如果换成  MMapDirectory 把优化注解掉,清除索引库,重新创建索引,执行。

1.1.png

关掉,原因是之前创建索引时用的是 standaranalyzer,而这时换成 ikanalyzer ,对于查询速率是不准确的,重现换成 standaranalyze,清除索引库,   standaranalyzerikanalyzer 中文分词器,分词的速度不一样,所以要换成跟以前代码一模一样,只有存放索引库用的对象不一样,才能对比出是否优化。

1.2.png

写入用了7425ms,快了一点。

3、第一次查询从硬盘中查,第二次从内存中查,所以在查询时不能用小例子,需要加入到项目中完成测试,加时间。起始时间。

long starttime= System. current TimeMillis();

4、在查询结束时有结束时间。

long endTime = System. currentTimeMillis();

打印时间

System. out .println("=====消耗时间为======" + (endTime - startTime) + "ms");

由于存的时候用是 MMapDirectory ,所以取的时候也用 MMapDirectory ,启动进行测试。打开浏览器搜索手机,花费324ms

1.3.png

再查询花费18ms。由此可见第一次是从硬盘中读取出来,把查询出的数据放到内存中,第二次点查询直接从内存中查出数据,速度非常快,把设置出来的数据放到里面。

*使用MNapDirectory消耗的查询时间

*====消耗时间为========324ms

*====消耗时间为========18ms

5、关闭项目看原来花费多少时间,再换成 FSDirectory 将索引库清除。

1.4.png

重新创建索引,重新启动项目,再查询,第一次查询花费324ms,第二次花费21ms,比用 MNapDirectory 花的时间长,因为是小100万条数据,数据很小,如果数据大一些,差距会更大,存放索引库的位置,用的对象不同,查询效率和创建索引的效率都不一样,建议使用 MNapDirectory ,用它代替传统 FSDirectory 文件系统的目录,加快查询效率。

 

二、搜索api的选择

1、尽量使用 TermQuery 代替 QueryParser TermQuery 能提供简单的查询,只能是通过域名查具体的某一个域值,QueryParser 里面非常强大,既有默认查询域的支持,又可以对查询的关键字,查询结果指定 andall 交集并集。如果没有过多的业务建议使用 TermQuery 进行查询,如果业务比较复杂,有好几个查询条件,求交集并集等,只能使用 QueryParser

2、尽量避免大范围的日期查询,大量的日期范围的查询会导致搜索效率变慢。

相关文章
|
3月前
|
机器学习/深度学习 数据采集 编解码
Stable Video Diffusion:将潜在视频扩散模型扩展到大规模数据集——论文阅读
Stable Video Diffusion(SVD)是Stability AI提出的高分辨率视频生成模型,基于潜在扩散框架,通过三阶段训练与严格数据筛选,在文本到视频和图像到视频任务中实现高质量生成。论文系统研究了数据质量对模型性能的影响,提出级联切分检测、运动评分过滤、合成字幕优化等策略,并引入线性递增引导等创新技术,显著提升生成稳定性与视觉保真度。
806 4
|
监控 druid
druid 连接池监控报错 Sorry, you are not permitted to view this page.
druid 连接池监控报错 Sorry, you are not permitted to view this page.
2495 0
|
存储 Android开发
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
1774 0
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
|
6月前
|
人工智能 Java 数据库
如何保证接口幂等性?
在分布式系统中,接口幂等性至关重要。本文详解其定义、重要性及实现方案,包括唯一索引、Token机制、分布式锁、状态机与版本号机制,并提供最佳实践建议,助你提升系统可靠性与用户体验。
1020 1
|
7月前
|
存储 JavaScript 安全
【HarmonyOS Next之旅】HarmonyOS开发基础知识(二)
本文主要介绍了HarmonyOS应用的配置文件说明、应用数据管理和应用安全管理三大核心内容。在配置文件说明部分,详细解析了“config.json”中app、deviceConfig和module三个关键组成部分的结构与功能,涵盖版本管理、设备配置及模块定义等细节。应用数据管理部分阐述了本地数据存储、分布式数据服务、文件共享及搜索服务等功能,确保跨设备数据一致性。应用安全管理则从开发准备、编码安全、权限使用到发布分发全流程,提供了保障应用安全的最佳实践。内容全面覆盖了HarmonyOS应用开发的核心环节,为开发者提供了详尽指导。
381 1
|
11月前
|
Java 程序员 API
菜鸟之路Day05一一正则表达式
### 菜鸟之路Day05——正则表达式 作者:blue 日期:2025.1.23 本文学习自BV17F411T7Ao,黑马程序员。主要介绍了正则表达式的两个作用:校验字符串是否满足规则和在文本中查找内容。详细讲解了字符类、预定义字符、数量词、逻辑词等基础知识,并通过多个Java代码示例演示了正则表达式的应用,包括用户名验证、身份证号验证、文本爬取等实际场景。
297 77
|
计算机视觉
【YOLOv8改进】 AFPN :渐进特征金字塔网络 (论文笔记+引入代码).md
YOLO目标检测专栏介绍了YOLO的有效改进和实战案例,包括AFPN——一种解决特征金字塔网络信息丢失问题的新方法。AFPN通过非相邻层直接融合和自适应空间融合处理多尺度特征,提高检测性能。此外,还展示了YOLOv8中引入的MPDIoU和ASFF模块的代码实现。详情可参考提供的专栏链接。
|
安全 网络安全 iOS开发
macOS系统安装NMAP扫描工具
macOS系统安装NMAP扫描工具
760 1
|
存储 SpringCloudAlibaba 数据可视化
SpringCloudAliBaba之Nacos配置中心:轻松管理配置文件
SpringCloudAliBaba之Nacos配置中心:轻松管理配置文件
2542 0
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
1018 5