beta技术沙龙:大型网站的Lucene应用

news/2024/5/13 19:18:37/文章来源:https://blog.csdn.net/iteye_15968/article/details/81968897

本文链接 beta技术沙龙:大型网站的Lucene应用

beta技术沙龙越办越有意思了,上次错过了阙宏宇的mod_cache(还有关于线程进程的讨论)就很可惜,这次关于Lucene的演讲,是无论如何不应该错过了。

到目前为止,全文检索已经完全不算高技术门槛了,记得以前看过一本书里面写:“今天,任何程序员,都可以很容易地构造一个全文检索应用”。是的,全文检索的基本原理大家都知道差不多了,剩下的只是实践。我见过纯粹自己开发的,具有AS(Advanced Search)、BS(Basic Search)、DI(Digest)等结构,“像模像样”的全文检索架构,不过应用更多的,却是在开源项目上完善、定制而来的,Apache的Lucene就是众多开源全文检索项目中,名气最大、资格最老、应用也最广泛的一个。本期beta技术沙龙,讲的就是大型网站中lucene的应用,主讲人是手机之家团队的唐福林(“手机之家”总是有些东东来共享,比如上次的DAL,这真是不错)。

众所周知,用Lucene构造一个“索引-查询”的应用是非常简单的,搭好环境,参照(修改)示范代码,很容易就可以成功。但是,要构造一个真正大规模、稳定、可靠的应用,就不说这么简单。程序的编写、模块的分布、架构的设计,都有许多费心思的讲究。按照PPT提供的数据,手机之家目前的Lucene应用,采用的是Lucene 2.4.1 + JDK 1.6(64 bit)的组合,运行在8 CPU, 32G内存的机器上,数据量超过3300万条,原始数据文件超过14G,每天需要支持超过35万次的查询,高峰时期QPS超过20。单看这些数据可能并没有大的亮点,但它的重建和更新都是自动化完成,而且两项任务可以同时运行,另一方面,在不影响服务可靠性的前提下,尽可能快地更新数据(如果两者发生冲突,则优先保证可用性,延迟更新),其中的工作量还是非常大的。

演讲的主要内容都PPT里,非常丰富,我就不再赘述了。要补充的是,这份PPT做得非常清楚,需求-目标-进度-设计-上线-测试-上线,整个流程非常清楚,给出的数据同样非常精当,我想,这也反映了手机之家团队的开发规范。

因为对Lucene的使用稍微有些经验,我在这里补充几句,权当狗尾续貂:

  1. 在大规模的应用中,Lucene更适合用于狭义的“搜索”,而不应当负责数据的存储。我们看看Lucene的源代码也可以知道,Document和Field的存储效率是不够好看的。手机之家的团队也发现了这一点,他们的办法是,用Lucene存放索引,用Memcache + Berkeley DB(Java Edition)负责存储。这样有两个好处,一是减小了Lucene的数据规模,提高了程序的效率;另一方面,这套系统也可以提供某些类似SQL的查询功能。实际上,Lucene Project自己似乎也注意到了这个问题,在Store中新增了一个db选项,其实也是利用的Berkeley DB。如果仅仅用Lucene存放索引,而不存放Document,并且合理配置,一台机器可以支持几十G甚至上百G的索引;如果需要用Lucene存放索引,最好在读取时使用FieldSelector,只读取需要的Field,如果使用恰当,性能会有10%左右的提升。
  2. 在大规模应用中,Cache是非常重要的。PPT中也提到,可以在程序提供服务之前,进行几次”预热“搜索,填充Searcher的Cache。据我们(银杏搜索)的经验,也可以在应用程序中,再提供针对Document的Cache,这样对性能有较大的改善(同一个JVM内部的Cache,速度更快一些)。Lucene自己似乎也注意到了这个问题,在2.4版本中提供了Cache,并提供了一个LRU Cache实现。不过据我们测试,在极端情况下,这个Cache可能会突破大小限制,一路膨胀最后吃光内存,甚至从网络上找的许多LRU Cache实现在极端条件下都有可能出现这样的问题(这也是我们百思不得其解的地方:反复检查程序的逻辑都没有问题),最终自己写了一个LRU Cache,并修改多次,目前来看是稳定的。
  3. 在编写Java服务程序的时候,记得设置退出的钩子函数(RunTime.getRunTime.addShutdownHook)是一个非常好的习惯。许多Java程序员都没有这种意识,或者有,也只是写一个finalize函数,结果程序非正常退出时,可能造成某些外部资源的状态不稳定。拿Lucene来说,之前的IndexWriter是默认autoCommit的,这样每添加一条记录,就提交一次,好处是如果中断,则之前添加的记录都是可用的,坏处则是,索引的速度非常低。在新版本中autoCommit默认为False,速度提升明显(我们测试的结果是,提高了大约8倍),但如果中途异常退出,则前功尽弃。如果我们添加了退出的钩子函数,捕获到退出信号则自动调用writer.close()方法,就可以避免这个问题。
  4. 目前的Lucene是兼容JDK 1.4的,它的binary版本也是JDK1.4编译的,如果对性能要求比较高,可以自行下载Lucene Source Code,用更新版本的JDK编译出.jar文件,据我测试,速度大约有30%的提升。
  5. 如果对并发的要求较高,可以考虑采用多IndexSearcher的技术,也就是在一个应用服务中,开启多个IndexReader(可以对同样的索引开启多个),每个IndexReader再生成一个IndexSearcher,将这些Searcher放在一个“池”里头,给搜索请求调用。这样可以大幅度提高并发的性能,代价是在写程序的时候就要考虑到这一点,进行相应的调整。

P.S. 据我观察,国内公司内部的项目,一般取的名字都中规中矩,以’er’结尾的比较多,多是Indexer, Crawler, Layer之类。好像很少有外国那种“天马行空”的奇特名字,譬如Hadoop(这是一个“没来由”的名字)、Lucene(这是个少见的姓)。国内我接触过不多,以前抓虾有个重要的DB叫tudui(“土堆”),目前银杏有个项目叫LaserTank,都是跟实际用途毫不相关的,印象反而深刻。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_717756.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AjaxLoad动态生成加载图标的网站

Generator Indicator type : Circle ballIndicatorKitArrowsIndicator BigSnakeBouncing ballBarBar 2Bar 3Circling ballHypnotizeWheelExpanding CircleRadarRefreshFlowerBackground color : # Transparent background Foreground color : # 网址:http://www.aja…

Mono团队自立创业 .NET入侵苹果平台,徐汇区网站设计

众所周知,.NET其实并不是Windows上的专有技术,这一点很大程度上要感谢Miguel de Icaza所领导的Mono开发团队。他们多年不懈地工作,实现了跨平台的开源.NET实现(包括CLR运行库、C#编译器和其他开发工具、组件)。今天的M…

使用GitHub创建博客 第一篇-如何使用github.io创建自己的网站

第一篇-如何使用github.io创建自己的网站首先要有一个Github账号创建Repositories选择主题修改网站使用vscode编辑网站访问首先要有一个Github账号 用户名好像不能用汉字,其它的信息自己填好就可以了 创建Repositories 登录上GitHub后,创建一个 new R…

1月第二周域名主机网站排名TOP15 西部数码升至第二

据国际统计机构Alexa最新统计数据,在1月9日至15日一周时间内,用户覆盖数排名TOP15的国内域名主机网站分别为:中国万网、西部数码、易名中国、新网、网域科技、金名网、35互联、爱名网、新网互联、商务中国、主机屋、中资源、中国数据、阳光互…

微软云计算官方中文网站上线啦

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 11月29日,微软云计算官方中文站http://www.microsoft.com/china/cloud 上线啦! 还…

dw cs6 html建站点,dreamweaver cs6网页中制作锚点链接的教程方法

部分网友刚刚下载使用dreamweaver cs6的朋友们,可能还不是很熟悉其中制作锚点链接?下面这篇内容就为你们带来了dreamweavercs6网页中制作锚点链接的教程方法。dreamweaver cs6网页中制作锚点链接的教程方法我们需要先打开dreamweaver cs6软件,选择一个空…

【转】如何让虚拟目录里面的webconfig不继承网站

今天要部署一个网站和一个和网站相关的webservices接口,我把网站部署后,就把WEB接口作为它下面的一个虚拟目录来处理了,这样他们可以共享一个域名.他们各个都有一个webconfig配置文件,部署后发现网站正常,可是WEB接口却报错,说配置文件出了问题,仔细检查发现WEB接口用的是网站的…

学用MVC4做网站一:用户登陆1.2

一用户 1.1用户注册 1.2用户登陆 首先在Models里添加用户登陆模型类UserLogin&#xff0c;该类只要用用户名&#xff0c;密码和验证码三个字段。 /// <summary>/// 用户登陆模型/// </summary>public class UserLogin{/// <summary>/// 用户名/// </summa…

一年来网站开发之总结(中国传统路线:血淋淋的散乱道路)

一.序幕 去年年底来到现在这个公司&#xff0c;这段时间内发生很多事情&#xff0c;直接或者间接的改变了这个创业互联网公司的命运。 关键角色有BOSS&#xff0c;PM&#xff0c;CTO。 BOSS在这个行业做了十几年&#xff0c;有了积累&#xff0c;然后想做做行业网站。听说同…

小说阅读网站的‘作者’为何不用实名制?

我们注意到&#xff0c;绝大部分小说阅读网站对‘作者’不用实名制。是什么原因导致的呢&#xff1f; 一、原因分析 其实网络作者&#xff08;注意&#xff0c;不是‘作家’&#xff09;之所以大都非实名制&#xff0c;与其起源有关。 1&#xff09;因为TA们一开始都是草根&…

年度盛宴:2012年最佳25个响应式网站设计作品《上篇》

2012年&#xff0c;响应式网站设计成为主流&#xff0c;这个概念由著名网页设计师 Ethan Marcotte 在2010年5月份提出&#xff0c;其目标是要让设计的网站能够响应用户的行为&#xff0c;根据不同终端设备自动调整尺寸。 响应式设计不再只是一个概念&#xff0c;众多大公司也把…

牟长青:浅谈如何提高网站PR值

2019独角兽企业重金招聘Python工程师标准>>> PR值如何提高&#xff0c;已经不是什么好神秘的事情。唯一的方法就是大量的增加外链&#xff0c;因此我这篇文章&#xff0c;虽然标题是如何提高PR值&#xff0c;其实主要就是讲如何增加外部链接&#xff0c;提高PR值。 …

Win7下安装配置IIS 构建自己的网站

一、首先是安装IIS。打开控制面板&#xff0c;找到“程序与功能”&#xff0c;点进去 二、点击左侧“打开或关闭Windows功能” 三、找到“Internet 信息服务”&#xff0c;按照下图打勾即可 等待安装完成 四、安装完成后&#xff0c;再回到控制面板里面&#xff0c;找到“管理工…

使用Mitmproxy工具进行小姐姐图片(不管什么网站,只要是.jpg格式的图片都可自动下载)的批量下载

抓取目标: 1.首先Mitmproxy工具的下载及使用: 点我观看! 2.实战——小姐姐图片批量下载: 实现——在你使用浏览器欣赏你自备的小姐姐图片资源的时候自动下载哦! <

分享35个富有创意的蓝色网站设计作品

蓝色是网页设计中最流行的颜色之一&#xff0c;蓝色表现出一种美丽、冷静、理智、安详与广阔。由于蓝色沉稳的特性&#xff0c;具有理智、准确的意象&#xff0c;在商业设计中&#xff0c;强调科技&#xff0c;效率的商品或企业形象&#xff0c;大多选用蓝色当标准色。今天这篇…

从零开始Web自动化(三):通过selenium,9行代码实现打字网站的自动打字

写在前面&#xff1a; 这个专栏主要是分享一些python、Web自动化的相关知识。 需要你具备一定的python基础&#xff0c;参考教程&#xff1a;廖雪峰python教程 掌握红框中的内容即可&#xff01; 通过实战项目让你学会包括&#xff1a;python、selenium、测试报告、监听、特殊…

从零开始Web自动化(四):如何过打字网站的作弊检测,从而实现排行榜第一

一、分析和解决思路 上篇博文中&#xff0c;我们的程序被检测出作弊了&#xff0c;那如何过检测呢&#xff1f; 思路&#xff1a; 我们打的太快了&#xff0c;完全超出了人类的极限。 而且也不可能一直都是一个速度&#xff0c;也不可能每个字母都打正确。 那我们要让程序打的…

网站url过滤不严格造成下载任意文件漏洞

年底了很忙&#xff0c;最近一直在处理安全问题&#xff0c;其中有一例比较有代表性&#xff0c;于是想拿出来说说。大概是这样的&#xff0c;网站在某个目录下提供pdf文档下载&#xff0c;但是出现了安全问题&#xff0c;通过对路径和文件名的修改&#xff0c;指定下载linux系…

优化网站设计(二十三):减小Cookie的体积

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices fo…

29.保姆级教程带你做一个属于自己的博客网站

功能介绍: 页面功能主页index.html展示添加博客和博客列表的文字,实现页面跳转添加页add.html输入文章标题及内容,并将内容提交到数据库中列表页list.html将数据库中所有博客展示到前端页面中,点击文章可以查看文章的详情,附带编辑和删除的功能详情页detail.html显示文章的…