`

如何提高Lucene的搜索速度

 
阅读更多
如何提高Lucene的搜索速度

译自:http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

这里讨论了提高基于Lucene的应用程序搜索速度的几种方法。如果你想提高索引的速度,请阅读“如何提高Lucene构建索引的速度”。

首先确定你需要加快搜索速度。这里的很多方法很容易尝试,但是有些会增加你程序的复杂性。所以请首先确定搜索速度确实太慢,而且速度问题确实是Lucene导致的。

确保你使用的是最新版本的Lucene。
使用本地文件系统。
远程文件系统搜索的速度总是会慢一些。如果你的索引必须放在远程文件系统之上,那么可以考虑把远程文件系统用“只读方式”加载(mount)。某些时候这会改善性能。
使用更快的硬件,尤其是更快的IO系统。
固态硬盘(solid-state disk,SSD)非常适合Lucene的搜索。SSD的寻道时间大概是传统磁盘式硬盘的100倍,也就是说常见的寻道时间造成的开销几乎可以忽略掉了。也就是说装有SSD的机器无需太多的内存作为文件缓存,搜索器在允许反应之前需要的预热(warm-up)时间更短。
调节操作系统。
Linux可以调节的一个典型的参数是swappiness(参看http://kerneltrap.org/node/3000,译注:可理解为交换系统,调节物理内存和交换分区使用倾向的),这个参数控制了操作系统把内存交换出到IO缓存的倾向性。这个参数在大多数Linux发行版中的默认设置都是一个很大的数(也就是说,倾向于交换分区),这容易造成严重的搜索延迟,特别是在查询频率不高的情况下,搜索一个大的索引时。请尝试把swappiness调低,甚至关闭(把它设置为0)。Windows也有一个选框,在我的电脑->属性->高级->性能设置->内存使用,允许你选择倾向于应用程序还是系统缓存,好像也是起这个作用的。
使用readOnly=true选项打开IndexReader。
在多线程共享同一个reader的时候这将起巨大的作用,因为这样会去掉处理线程冲突的代码。
在非Windows平台,使用NIOFSDirectory取代FSDirectory。
这样访问这些文件的时候,也会去掉处理线程冲突的代码。不幸的是,由于Sun JRE Windows版本长期存在的bug(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6265734),NIOFSDirectory在Windows下表现很差。
使用IndexSearcher的同一个实例。
在程序的查询和线程之间,使用单一的一个IndexSearcher的实例。
测量性能的时候,忽视第一条查询。
对搜索器的第一次查询,要付出初始化缓存的代价(特别是按照字段排序的时候),会干扰你的结论(假设你重用搜索器进行多次查存)。另外一方面,如果你一遍遍的重复同样的查询,结论也会被扭曲,因为操作系统会使用它的缓存加速IO操作。Linux(核心2.6.16或者更新版本)下,你可以用命令 sync ; echo 3 > /proc/sys/vm/drop_caches 来清空缓存。参见http://linux-mm.org/Drop_Caches。
仅在需要的时候重新打开IndexSearcher。
只有在需要让最新提交的更新出现在搜索中的时候,才应该重新打开IndexSearcher。注意,重新打开搜索器有它的开销(在大的索引和排序打开的情况下可以被察觉到的),必须将这一开销最小化。可以考虑在面对第一个查询之前,使用预热技术对缓存进行预热。
搜索前对你的索引进行优化(optimize)。
优化(optimize)过的索引只有一个段,这样通常比多个段速度快得多,尤其是对于大的索引。如果你的程序不经常更新索引,那么最好是,先构建索引,然后优化,使用优化过的索引进行搜索。如果你的索引更新频率很高,而且更新后就要刷新搜索器的话,那么优化对你的开销就太大了,你可以采用降低合并因子的方法。
降低合并因子(mergeFactor)。
小的合并因子意味着更少的段和更快的搜索。然而,这将降低索引的速度,所以,你应该测试这个值,直到找到对于你的程序满足平衡的值。
限制保存字段和词向量的使用。
从索引中获取这些信息开销太大。一般来说,你应该只获取用户看前可见的“页”内的条目的这些信息,而不是整个结果集的。针对每个获取的文档,Lucene必须寻道到不同文件的不同位置。尝试首先用docID排序你要获取的文档(译注:有可能提高寻道效率)。
在你获取一个文档时,使用FieldSelector仔细的选择要载入哪些字段,以及如何载入他们。
不要枚举比所需命中结果更多的结果。
枚举所有的命中很慢,有两个原因。首先,返回Hits对象的search()方法在你需要超过100个命中的时候,需要内部重新执行搜索。解决方法:用带有HitCollector的search方法代替。其次,命中通常遍布磁盘的每个角落,访问全部需要大量的I/O活动。这很难避免,除非索引小到可以直接放到内存里。如果你不需要完整的文档,而只需要一个(小的)字段,那么你可以用FieldCache类来缓存它,这样就可以告诉访问它了。
使用模糊查询(fuzzy query)的时候设置最小的前缀长度。
模糊查询执行耗费CPU的字符串比较──要避免将用户输入的词和所有的索引的词项进行比较,应该只比较前“N”个字符相同的词项。前缀长度是QueryParser和FuzzyQuery都有的参数,默认为0,所有的词项都要比较。
考虑使用过滤器(filter)。
把结果限定在索引的一部分时,使用缓存的位域过滤器比使用查询条件高效得多。尤其是在限制条件包含了一个大索引的大量文档时。过滤器通常用于限定一个分类下的结果,但是可以在很多中情况下替代任何查询条件。查询和过滤之间的一个区别在于,查询影响结果评分,过滤不影响。
找到瓶颈。
复杂的查询分析或者对结果过度处理,是隐藏的搜索瓶颈的例子。使用VisualVM这样的工具profile程序可以帮助定位这些问题。
分享到:
评论

相关推荐

    基于STM32通过PWM驱动直流电机

    工程代码基于STM32F103C8T6,使用PWM输出驱动电机,电机驱动使用TB6612,通过按键控制电机速度,并且速度通过OLED显示屏进行显示 使用到的硬件:STM32F103C8T6最小系统板,四针脚OLED显示屏,直流电机,按键,TB6612电机驱动模块

    最新微信文章编辑器排版工具程序源码.rar

    最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar

    信息办公电信计费系统完整代码-netctossconformity.rar

    这个压缩包 "netctossconformity.rar" 包含了一套电信计费系统的完整代码,它是针对计算机专业学生或开发者的JSP源码资料。这套系统的设计旨在为电信运营商提供一个可靠、高效的计费解决方案。通常,这种系统会涉及到用户账户管理、费用计算、账单生成、支付处理以及数据报告等功能模块。在内容上,该资料包可能包括了前端用户界面和后端服务器逻辑的源代码,使用JSP(Java Server Pages)技术实现。前端可能会涵盖用户注册、登录、查看账单和支付历史等操作的用户界面,而后端则包含数据库交互、计费算法、用户验证和安全性措施等关键功能。对于学习者来说,这个资料包是一个宝贵的实践资源,可以帮助他们理解电信计费系统的工作原理,以及如何运用JSP技术开发复杂的商业应用。通过分析这些代码,可以加深对Java Web技术栈的理解,包括但不限于Servlet API、JDBC(Java Database Connectivity)、HTML/CSS/JavaScript,以及可能涉及的框架如Spring或Struts。此外,这个资料包也可能含有一些文档,例如系统设计说明、代码结构介绍、部

    交流电桥实验(95).zip

    交流电桥实验(95).zip

    matlab基于四自由度机械臂的轨迹规划源码.zip

    优秀源码设计,详情请查看资源内容

    MRU3-2保护技术简化电压继电器对称分量评估 SEG

    MRU3-2保护技术简化电压继电器对称分量评估 MRU3-2保护技术简单电压继电器,具有对称分量评估功能

    图3-7.zip

    图3-7.zip

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    新建 文本文档.txt

    新建 文本文档.txt

    最新获取QQ微信头像橘头像阁PHP源码下载.rar

    最新获取QQ微信头像橘头像阁PHP源码下载.rar最新获取QQ微信头像橘头像阁PHP源码下载.rar

    3D模型004,可用于建模、GIS、BIM、CIM学习

    3D模型004,可用于建模、GIS、BIM、CIM学习

    node-v6.7.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    其他类别动态显示JSP服务器内存的Ajax程序 图像版-systemjc.rar

    在当今的Web开发中,实时监控服务器性能是至关重要的。其中,动态显示JSP服务器内存的Ajax程序图像版_systemjc.rar是一个为开发者和系统管理员提供便利的计算机专业JSP源码资料包。这个资料包的核心是一个高效的Ajax程序,它能够实时获取并展示JSP服务器的内存使用情况。通过使用这一工具,用户可以在一个直观的界面上看到服务器内存的使用率、已使用内存、可用内存等关键信息,而这一切都无需刷新页面。这得益于Ajax技术的强大功能,它允许在后台与服务器进行异步通信,从而获取最新的数据并更新前端界面。这个资料包不仅包含了完整的源代码,还提供了详细的文档和注释,使得即使是初级的JSP开发者也能够轻松地部署和使用。此外,它的图像版设计使得数据的展示更加直观和友好,帮助用户快速识别任何潜在的问题。总的来说,动态显示JSP服务器内存的Ajax程序图像版_systemjc.rar是一个强大、实用且易于使用的JSP源码资料包,它为实时监控服务器性能提供了一个有效的解决方案。重新回答||

    引领AI视频生成技术新潮流之Sora AI

    Sora AI,作为OpenAI继ChatGPT之后的又一重磅力作,以其独特的文本到视频模型技术,在AI内容创作领域掀起了一场革命性的风暴。本文将详细探讨Sora AI的技术特点、应用场景以及未来发展趋势,展现其在视频制作、广告、教育和娱乐产业中的巨大潜力。 Sora AI作为OpenAI的又一力作,以其独特的文本到视频模型技术引领了AI视频生成技术的新潮流。通过深入了解Sora AI的技术特点、应用场景和未来发展趋势,我们可以看到它在视频制作、广告、教育和娱乐产业中的巨大潜力和广阔前景。然而,我们也应清醒地认识到,技术的发展总是伴随着挑战和问题,只有不断探索和解决这些问题,才能让Sora AI更好地服务于人类社会。

    新闻文章NTsky新闻发布系统 v1.0稳定版-18655.rar

    NTsky新闻发布系统 v1.0稳定版_18655.rar是一款专为计算机专业人士设计的JSP源码资料包。这款资料包的主要功能是帮助用户快速、高效地管理和发布新闻信息。它采用了先进的JSP技术,结合了数据库管理系统,使得新闻的发布和管理变得简单而直观。该资料包包含了完整的源代码,用户可以根据自己的需求进行修改和优化。同时,它还提供了详细的使用说明和技术文档,即使是对JSP技术不太熟悉的用户,也能快速上手。此外,该资料包还具有良好的用户界面设计,使得操作更加人性化。NTsky新闻发布系统 v1.0稳定版_18655.rar的另一个优点是其稳定性。经过多次测试和优化,该系统已经达到了稳定运行的状态,可以满足用户在各种环境下的使用需求。无论是在个人电脑上,还是在服务器上,都能稳定运行。总的来说,NTsky新闻发布系统 v1.0稳定版_18655.rar是一款功能强大、操作简便、稳定性高的JSP源码资料包。无论是对于专业的计算机人士,还是对于初学者,都是一个很好的学习和使用工具。重新回答||

    node-v6.17.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    245ssm-mysql-jsp 在线租房系统.zip(可运行源码+数据库文件+文档)

    此次开发的是一款在线的租房管理系统,该系统从功能上来看,应该具备以下模块: (1)房源信息模块:房源信息展示、房源信息更新、房源信息增加、房源信息删除; (2)账户管理模块:账户登录、账户绑定、账户管理; (3)租金结算模块:每月租金信息、租金交付功能、月租金收入总额统计; (4)房屋租赁合同管理模块:房屋租赁合同录入、房屋租赁合同展示、房屋租赁价格修改、房屋租赁合同终止; (5)报障模块:租客报账、管理员报障审核、租客报障统计; (6)日程模块:收租日程显示; 从角色的需求上来划分,应当具有三个角色要素,分别为租客、出租方以及管理员三个角色,租客能够实现在线的查看房源,申请租房,签订租赁合同以及租金每月支付等功能。房东应当可以实现租金收入的统计,租赁合同的展示以及租赁价格的修改等。管理员能够通过后台的管理对网站信息进行常规化的管理操作。 通过SSM框架技术搭建在线租房网站,能够实现出租方在线登记房源信息,租赁方能够在线查看消息,并在线与出租人进行沟通,可以实现在线租房申请。后台的管理员能够通过管理手段来对整个系统进行维护和管理。

    udacity机器学习工程师毕业项目.zip

    机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。 机器学习的发展历程可以追溯到20世纪50年代,当时Arthur Samuel在IBM开发了第一个自我学习程序,一个西洋棋程序,这标志着机器学习的起步。随后,Frank Rosenblatt发明了第一个人工神经网络模型——感知机。在接下来的几十年里,机器学习领域取得了许多重要的进展,包括最近邻算法、决策树、随机森林、深度学习等算法和技术的发展。 机器学习有着广泛的应用场景,如自然语言处理、物体识别和智能驾驶、市场营销和个性化推荐等。通过分析大量的数据,机器学习可以帮助我们更好地理解和解决各种复杂的问题。例如,在自然语言处理领域,机器学习技术可以实现机器翻译、语音识别、文本分类和情感分析等功能;在物体识别和智能驾驶领域,机器学习可以通过训练模型来识别图像和视频中的物体,并实现智能驾驶等功能;在市场营销领域,机器学习可以帮助企业分析用户的购买行为和偏好,提供个性化的产品推荐和定制化的营销策略。 总的来说,机器学习是一个快速发展且充满潜力的领域,它正在不断地改变我们的生活和工作方式。随着技术的不断进步和应用场景的不断扩展,相信机器学习将会在未来发挥更加重要的作用。

    node-v12.6.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    最新UI站长引流工具箱 带后台+安装说明.rar

    最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar

Global site tag (gtag.js) - Google Analytics