基于Lucene的近实时搜索引擎优化总结

一、搜索优化:

在工程领域,越是看起来“简单、确定”的问题,越是难以解决。近实时搜索引擎需要解决的问题只有一个:性能!它包含快速索引,快速搜索,以及索引到搜索的快速生效。

以下为百万条数据级(适用于千万级)快速滚动数据近实时搜索引擎实践经验总结:

 1. 针对技术优化

1.1 数值搜索优化: 将数值的范围缩小,能用 int值 的不要用 long值,能用 float值 的不用要 double值;能用string 替换的,就不要用范围查询(特别是大范围查询),这些都基于Lucene搜索引擎对数值建索引和范围查询的原理和特点所决定;

1.2 搜索语法的简化和高级搜索的支持取得一个平衡点: 谨慎用"*","?"(Wildcard搜索),禁止出现 "*AA"的查询,如果必须支持这样的查询,则需要培训用户了解"*"可能引起的性能问题。

 2. 针对业务优化

2.1 特别强调范围查询,必须优化。避免大范围数值查询,数值范围查询不可避免的情况下,尽量使用小范围,这是由业务性质决定的,比如:说 A > 0的查询,需要优化为某个更有意义的查询: [A : 0-100]。

2.2 能使用短字符串(特别是不做分词的字符串)搜索的来替代,一定不要用数值搜索。数值搜索的特定虽然快,但对范围查询,它有一定的代价,如果使用不合适,代价会很大。

二、索引优化:

优秀的搜索引擎是快速创建索引和快速搜索的一个平衡体。特别对近实时搜索引擎而言,这个平衡点更为难以达到。

通过一系列测试和验证,Lucene在【搜索】,【索引】以及【优化】之间要达到平衡其实很不容易。在频繁的搜索和索引下,在线的优化难以真正起效果。可以理解为优先级有这样的特性:搜索 > 索引 > 优化。搜索的时间相对最短,优化的时间最长。在前二者频繁操作下,优化没有机会(强行优化只能导致,搜索和索引停顿,对近实时系统来说不可接受)。因而必须设置好相应的参数,主要包括:缓存大小,索引内存大小,索引单次提交数量上限(等同Merge因子,Lucene不一定严格执行),搜索最大并发数等。

大部分的索引优化是基于搜索业务的,如上述一所描述的用字符串字段替代数值范围查询。而索引本身的创建方式又直接影响到搜索,对Lucene来说Merge因子的配置是个关键(内存足够大的情况下)。简单的说,Merge因子小,索引慢,但对大批量建索引性能影响却不大(索引内存足够大为前提),但同时它会使得索引段落数被限制在合理范围值(直接影响索引段数——搜索性能)。相反如果Merge因子小,搜索会很快,段数也大,如果不及时做索引优化,对搜索性能的影响是致命的。

三、分布式平衡

一台Lucene服务器要想达到近实时搜索基本是不可能的,除非搜索量非常小。单台搜索量5个/s以上,一台基于Lucene的实时搜索基本上会吃不消,原因不在于搜索本身,而在于索引的同时,保证搜索实时性。而建索引的过程如果产生的碎片(段)过多,会直接影响搜索。总结下来,给予建索引的服务器一定的空闲时间是必须的,也就是说在建索引的时间段,搜索不能太过频繁。因而分布式分摊搜索压力是很有必要的。

总结:

1. 目前3台基于Lucene的PC服务器,高峰并发数量在15个/s左右;

2. 数据量为百万条级别(不到200万),80个字段,每条大概为200字符(中文、英文、数字);

3. 搜索条件基本在7-20关键字,平均搜索速度为98ms。

时间: 2024-11-04 18:23:47

基于Lucene的近实时搜索引擎优化总结的相关文章

5.3 基于用户行为分析的搜索引擎优化

传统的搜索引擎在给用户带来巨大便捷的同时也存在着不足,如用户不能快速查找到自己需要的信息等.用户行为分析,可以把隐藏在用户行为之下的信息,如用户的兴趣爱好,用户的领域,用户的搜索倾向等进行归纳总结,通对用户行为的学习,使搜索结果更加有针对性地面向特定用户,优先返回用户感兴趣的网页内容.时刻关注用户的基本信息及其操作,如籍贯.性别.兴趣.年龄.登录时.IP地址.搜索请求.浏览记录以及满意度评价等,并通过相关的软件技术对用户使用搜索引擎的行为进行跟踪,同时对这些信息进行统计分析,有助于设计搜索引擎的

C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil

最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Spring Boot.Spring Cloud的各种框架原理,同时也随时关注着.NET CORE的发展情况及最新技术点,也在极客时间上订阅相关的专栏,只要下班有空我都会去认真阅读观看,纸质书箱也买了一些,总之近一年都是在通过:微信技术公众号(.NET.JAVA.算法.前端等技术方向).极客时间.技术书

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

这两天加班,不能兼顾博客的更新,请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容,而我们又想像数据库那样能直接体现在查询中,这里就是我们所说的增量索引.对于这样的需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的: 这里我们一般可能会想到,将之前的索引全部删除,然后进行索引的重建.对于这种做法,如果数据源的条数不是特别大的情况下倒还可以,如果数据源的条数特别大的话,势必会造成查询数据耗时,同时索引的构建也是比较耗时的,几相叠加,势必可能造成查询的时候数据缺失的情况

聊聊基于Lucene的搜索引擎核心技术实践

最近公司用到了ES搜索引擎,由于ES是基于Lucene的企业搜索引擎,无意间在"聊聊架构"微信公众号里发现了这篇文章,分享给大家. 请点击链接:聊聊基于Lucene的搜索引擎核心技术实践

基于搜索引擎优化Internet的策略研究

随着Internet技术的迅速发展,使得用户要想在信息海洋里查找目标信息,就如大海捞针一样,搜索引擎技术恰好解决了这一难题.搜索引擎是人们获取网络资源的主要工具,然而搜索引擎在给网络用户带来巨大便捷的同时, 由于其信息检索技术智能水平的限制以及对自然语言理解的制约,在网络信息的检索中存在许多不足.因此,搜索引擎优化(Search Engine Optimization,SEO)技术应运而生. 随着Yahoo.Google等著名搜索引擎的出现,搜索引擎优化技术也逐渐发展起来.从最初意识到网站首字母

基于搜索引擎优化策略的研究

1.1.1   随着Internet技术的迅速发展,使得用户要想在信息海洋里查找目标信息,就如大海捞针一样,搜索引擎技术恰好解决了这一难题.搜索引擎是人们获取网络资源的主要工具,然而搜索引擎在给网络用户带来巨大便捷的同时, 由于 其信息检索技术智能水平的限制以及对自然语言理解的制约,在网络信息的检索中存在许多不足.因此,搜索引擎优化(Search Engine Optimization,SEO)技术应运而生. 随着Yahoo.Google等著名搜索引擎的出现,搜索引擎优化技术也逐渐发展起来.从最

基于lucene的案例开发:实时索引的检索

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44279753 http://www.llwjy.com/blogdetail/31bb705106379feaf6d31b58dd777be6.html 个人博客小站搭建成功,网址 www.llwjy.com,欢迎大家来吐槽~ 在前面的博客中,我们已经介绍了IndexSearcher中的检索方法,也介绍了如何基于lucene中的NRT*类去创建实时索引,在这篇博客中我们就重点介

基于lucene的案例开发:实时索引的修改

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44280311 http://www.llwjy.com/blogdetail/e42fa5c3097f4964fca0fdfe7cd7a9a2.html 个人的博客小站已经上线了,网址 www.llwjy.com,欢迎大家来吐槽~ 上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查

Lucene实现SearchManager近实时搜索

lucene通过NRTManager这个类来实现近实时搜索,所谓近实时搜索即在索引发生改变时,通 过线程跟踪,在相对很短的时间反映给给用户程序的调用 NRTManager通过管理IndexWriter对象,并将IndexWriter的一些方法(增删改)例如 addDocument,deleteDocument等方法暴露给客户调用,它的操作全部在内存里面,所以如果 你不调用IndexWriter的commit方法,通过以上的操作,用户硬盘里面的索引库是不会变化的,所 以你每次更新完索引库请记得co