说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何使用15美元每月的机器实现百万文档检索

HTML文档下载 WORD文档下载 PDF文档下载
有了对搜索产品足够深入地了解,再进行一些实验,从廉价的硬件中获得高性能是完全可能的,我们完全可以避免对SaaS的依赖,从而节省大量的费用。了解系统的内部原理也能在你向SaaS平台转移时,帮助你作出正确的决定。

【编者按】如何在廉价机器上运行一个超过300万份文档的搜索?云计算时代,托管搜索服务很受欢迎,但实际上并不是经济的选择,而且也不一定能有效解决问题,Solr是一个基于Lucene的高性能全文搜索服务器,采用Solr,我们完全可以避免对SaaS的依赖,通过对搜索产品进行足够深入地了解,再进行一些实验,从廉价硬件中获得高性能是完全可能的,那怎样才能实现这个过程?系统集成架构师Richard Donovan为我们带来了精彩分析。

以下为译文:

Gwittr以twitter搜索为人所知,同时它还是一个统计信息的网站,除了提供有关推文及链接网页的扩展搜索,也进行数据的统计分析。这篇文章重点介绍如何在廉价(< $15/月)机器上运行一个中型、大型搜索(超过300万份文档)?


面临哪些挑战?

  • 把这个问题丢给云计算既不便宜也不一定能得到解决;
  • 避免为不必要存储空间支付过高的费用;
  • 了解文档字段定义并针对检索需求做优化;
  • 精心设计查询;
  • 研究提交策略;

这些优化对Solr有效,也同样适用于任何基于Lucene的搜索引擎,比如Elastic Search。

把问题扔给云计算怎么样?

在这个云计算和EaaS(Everything as a Service,一切皆服务)时代,对于那些产品需要搜索功能的公司,托管搜索服务很有吸引力。虽然一秒钟只收几美分的云服务听起来很划算,但是到实际应用中,每个月很容易就会产生数百甚至数千美元的费用。

避免这些费用的方法就是在vanilla硬件或者虚拟机上运行自己的Solr,这不仅可以帮助你节省大量的费用,而且还会帮助你获得有关搜索引擎的技能和知识,利用这些技能和知识,可以帮助你进一步节省大量的开支,即使在你要转用其他搜索平台的时候,这些知识和技能也是必不可少的。

在Gwittr中,我们可以在非常便宜的虚拟机中运行Solr实例,而且我们还可以在没有太大延迟的前提下,对数据进行相当高级的统计。于此同时,我们需要遵循以下几个原则。

搜索不等于存储

像Solr这样的搜索引擎不等于数据库存储,索引是很重要的,如果你忘了这一点,只将搜索索引看成内存,那就会产生一些风险:

  • 数据丢失。尽管Solr确实采用了一些保持数据完整性的技术,但保证数据持久性毕竟不是这些系统的长项。
  • 由于Gwittr这样的流媒体数据搜索,搜索专用的存储将得到快速发展。如果你正在使用SaaS,那就意味着将数据存储到Solr中或是内存中是很有必要的。
  • 敏捷性的损失。重建索引以支持新功能是不可避免的,如果不为此做好准备,将失去敏捷性。

优化#1  将搜索索引看作是可任意处理、易于重建的资源,因为当你需要引入新的特性时,应用程序需要经常性、大规模重建索引。

确定架构中的所有字段不通过默认方式存储,这对使用普通的功能已经足够了。一般你不需要在Solr中存储文档字段,除非你要使用突出显示的功能,因为Solr在使用一些突出显示功能时,需要用到文档中的初始文本。你也会想要存储更多的东西,比如文档标识符,因为在应用程序代码中,你可能会用到文档标识符将搜索结果链接回内存。

Solr还提供一套扩展的字段索引选项,帮助你进一步简化索引的过程。

浏览vs.搜索

虽然Solr、Lucene等一系列产品在市场上被称为“搜索引擎”,但实际上,称它们为优越的浏览引擎(具有面片化(faceting)功能的浏览引擎,这也是一个强有力的卖点)更恰当,相比那些开源数据库,它们有极好的文本搜索性能。如果你去了解一下用户体验是如何设计的(包括怎样才能让Web爬虫看到你的网站),除非你是Google,如果不是你很有可能会发现:大多数情况下,你的用户在搜索关键字后还会单击相关导航功能(面片(facet)以及类似文档……),至少像Gwittr那样,让访客可以看到所有的结果,在没有输入任何关键字的情况下对数据进行挖掘。

优化#2  在“浏览”相关查询时,最好使用Solr的过滤器,而不是在“q”参数中堆砌。Solr过滤的文档集被缓存,它们没有进行任何相关性得分的计算,所以,使用它们浏览查询将为你节省宝贵的I/O和CPU周期。

此外,搜索引擎不会在匹配集中显示太多的结果页,显示的结果页越多,需要的临时内存就越多,结果获取的速度也就越慢。就算是Google,搜索的结果最多也不会超出1000页。

优化#3  在应用程序中加入分页限制。

优化#4  只请求那些你需要用来显示结果的字段,从而尽量减少I/O和带宽。

Solr提交不等于RDBMS提交

在数据库中,我们无时不刻不在使用事务和并发机制,在更新操作涉及到许多行或者许多表时,这是确保数据完整性的一个正确方法,在Solr中,“提交”有着迥然不同的语义。

你很有可能已经知道,在Solr中没有所谓的“更新”、“数据完整性外键”或者“多表”,实质上,Solr/Lucene只是通过索引形式管理日益增长的文档集合。每次添加、更新或删除一个文档集合,Solr就会向其数据目录中添加一个新“段”(一堆文件),最后段的数量会越来越大。有一种机制可以应对这种情况,这里就不再赘述。

在Solr中,通过一个Searcher对象可以处理所有的搜索查询。Searcher建立在索引组成的段的集合上。提交在这里的作用很简单:“让Solr生成新的Searcher,包括新段,并以原子方式用它替换当前Searcher。”

不要过分追求速度

优化#5  避免不惜代价的并发提交,因为你不停地构建新的Searcher,之后又把它扔了。事实上,同时构建Searcher会导致在Solr的配置中产生一个显式设置对数目施加严格上限,默认值是2。所以如果你同时提交的话,很有可能会获得异常堆栈,抱怨打开的Searcher太多。

优化#6  监视建立新Searcher的时间。优化在Solr中新建/更新文档的响应时间(流行的说法是“实时”),总的来说就是尽量减少Solr生成一个新Searcher对象的时间。监视Solr日志,查找“事件=newSearcher”,然后查找那些行QTime(查询时间),为的是使时间尽可能合理的短(我们稍后将看到为什么“合理”在这里很重要),因为构建新Seacher的速度越快,你可以构建的Seacher就越多,插入、更新和删除的响应就越快。

在Solr中有两个主要的提交策略。第一个策略就是让Solr在固定的时间间隔完成提交,该方法被称为自动提交,应作为首选策略考虑,它可以帮助你摆脱对应用程序的手工管理。事实上,如果你使用了自动提交,那让应用自己提交就成为一个非常糟糕的办法,记住重叠Searcher的上限也适用于自动提交的Searcher,所以要让自动提交比构建Searcher的时间更长。自动按固定时间间隔提交存在问题——在索引没有更新时,定期构建新的Searcher只是在浪费CPU,这也为我们指出提交的第二个策略:

优化#7  让应用程序根据需要执行提交。并发是一个糟糕的办法,应该实施全局的锁机制。

给Searcher热身

你可能会想“构建只增加了一个段的新Searcher能有多慢?Solr很好地支持这一点而且肯定会非常快”。你说对了,它的速度确实非常快。

唯一的问题是新Searcher最初的几个查询将会非常慢,这并不好。在高容量搜索环境中,几个缓慢的查询可能成为产品的短板,最终影响到应用程序层。这些最初查询缓慢背后的原因是新Searcher缓存中填充的东西是无用的。在Solr术语中,这被称为“Cold Searcher”。Solr允许使用“Cold Searcher”,但幸运的是这仅存在于其他Searcher也没有被注册的情况下。也就是说,它只发生Solr的实例刚开始时。在所有其他情况下,Solr会提供了一些给“Searcher”热身的机制,确保在它们被用到服务请求时,查询的速度不会太慢。

优化#8  有两组设置影响到新Searcher的热身,应该将两者结合起来使用。

  • 一组是设置Solr对热身中的Searcher进行查询。针对这些查询,可以建立几个实时应用程序的典型查询样本,使其在移除过滤器后能更通用一些,关键是要尽量包括将在应用程序中使用的各个方面,还可以发出几个关键字查询,因为如果有足够的空间,这种方法会在内存中加载全文索引。
  • 另一种给新Searcher热身的方法是在缓存中建立autowarming。高速缓存autowarming是将旧缓存中的值预先填充到热身中的Searcher缓存中。

对于热身中的Searcher关键是要找到建立新Searcher与注册Searcher在时间上的平衡(建立新Search可以很快——但很危险),找到这个平衡点需要进行实验,而这一切都取决于应用程序层的需要。

结论

有了对搜索产品足够深入地了解,再进行一些实验,从廉价的硬件中获得高性能是完全可能的,我们完全可以避免对SaaS的依赖,从而节省大量的费用。了解系统的内部原理也能在你向SaaS平台转移时,帮助你作出正确的决定。SaaS是个避免扩展和备份等头痛事情的好办法,但不要忽略了这些服务的背后的技术,不然即使你支付很高的费用,也不一定能得到高性能。

原文链接:Guerilla Search with Solr - How to run a 3 millions documents search on a $15/Month machine. (翻译/毛梦琪 责编/魏伟)

以“ 云计算大数据 推动智慧中国 ”为主题的 第六届中国云计算大会 将于5月20-23日在北京国家会议中心隆重举办。产业观察、技术培训、主题论坛、行业研讨,内容丰富,干货十足。 需要购买的朋友,请抓住这最后的机会,点击报名!

APSys 2014,AMD将发表基于异构体系的DNN实现与评估 PagerDuty实战分析:将MySQL迁移至XtraDB并成功运行EC2 Molecule:自食其力的免费HTML5游戏框架 智能家居升级:Nest启动开发者计划,并开放API Docker,从这里做起! 《近匠》云巴创始人张虎:低门槛云服务为小团队创造更多机会 Oculus公司同意收购Xbox 360手柄设计团队 公有云VS私有云 哪个数据更安全? 调查:开发者越老越吃香吗? Facebook在线支付:取代虚拟货币的终极边界 Google I/O前析:关于新一代设计框架Quantum Paper的猜想 Google I/O 2014前瞻:“令人发指”的Android产品线 福昕熊雨前:PDFium开源项目的背后 Dropbox无法登陆,国内企业网盘横向评测! 如果编程语言是超级英雄…… 谷歌发布Material Design设计语言 系统、功能与设计,Android L究竟新在哪儿? 《近匠》游道易副总裁孙可:发行商眼中的手游市场 布道师徐立:Docker是标准化IT结构的新方式 解读全新Google Play Games:多屏游戏时代终于来了! 设计神器PaintCode 2.1发布,完全支持Swift 一周消息树:天河二号以每秒3.3亿亿次的速度再居世界超算榜首 传闻微软计划用Lumia品牌取代Surface 【CTO俱乐部读书会】杨立东:技术团队留人“三板斧” 蓝港在线王世颖:浅谈手机游戏发行的成功基因 美国高通公司执行董事长Paul E. Jacobs:移动科技——精彩现在,辉煌未来 告别公用云,Instagram已将服务迁至Facebook数据中心 华为助力凤凰实现全媒体战略 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新 Docker CEO Ben Golub:Docker借助开源、天时走向成功 社交网络先驱、服役十年的Orkut被谷歌关闭 在c/s之间,数据处理的问题 vb中的类的多样性,怎么表现出的? 谁能告诉我DELPHI6.0安装盘的序列号.送分,thanks!!! UFO 的秘密!最新发现,足以推翻以前任何种学说,想知道UFO真正的面目者,进来看看。 菜鸟问高手,如何在一个多文档程序中,关闭子窗口? 关于漂亮虫虫的疑惑 如何移动edit控件,使用什么函数?谢谢 servlet和JSP有何区别?(菜鸟级) template class declare? 请教一个很菜的问题,赶快请进 高手看过来,关于ipc的问题! 怎样在listbox中保存信息? 刚刚学习ASP,请问在哪里可以下载ASP的资料!!!!! swing中哪个类可以用作ToolBar中的按钮? 要能显示图象的 template 怎样更改trichedit鼠标指针样式? 我正在寻求仿XP菜单的源代码或控件,不知道哪位高手有????(email:zhem8@yeah.net) 关于创建不规则窗口的问题,请一定帮忙。谢谢!我只有100分了~~~~~~~~~~~~~~! 用cdonts发邮件时为什么把附件发到了内容当中,都是乱码,应该怎么改? Coledatetime同oracle8中的date类型相同吗? 关于操作系统 怎样拦截某个控件的消息? 请问怎么不加lib档又可以编译做好的dll?? 请问DivX的使用 请问有谁研究过USB接口的驱动????? 简单问题:怎么给我满意的答复加分呢? 救命啊。。。 9行程序崩溃WIN2000/xp 太、太、太好了!连帮助都是中文的,还可以继承、多线程,盗版比正版还提前发布。 关于C++的构造函数的问题 初学java网络编程的问题 KYLIX如何连接ORACLE? 有全套的ERP源代码出售 俺的机子装了Linux现在想改装WindowNT,用NT分区格式化后,咋一启动就显示LI,然后就不动了。 我安装了win2000和redhat Linux7.2,要启动盘才能进入Linux,怎样能在启动时选择进入 pb6.5 + personal oracle 815 连接数据库数据库出错!!! 哪位用VC编写XML处理程序的大侠: 100分求购密码登陆jsp程序 vb如何让我Happy 请教:关于ODBC的密码? 使用log函数,应该import那个库 请问关于数据库存储过程调试的问题,急! 关于CPROPERTYSHEET 的一些小问题!! windows message的疑问? 这是什么问题啊!提示:select error:Data-conversion resulted in overflow. socket 一对多的问题 请教有关typedef的问题(菜鸟问题) 基于对话框的应用程序怎么操作数据库? Sybase数据库备份 谁有正版dotnet下载的ftp站点?有分啊!!! 公司的头交了一个任务给我,让我解决以前公司做的三层结构的效率问题,还请大家帮忙发表下意见,谢谢 碳酸钠从溶液中析出时常带结晶水,其结晶水的质量分数为多少? 英语年份咋简写英语的年份比如,1889年, 接地电阻的作用?R201在这里起到什么作用? 煤油有没有腐蚀性 (1/2)少量的NaOH和NH4HCO3反应过程中,会牵扯到OH-先和NH4+反应还是先和HCO3-反应,答案是先和HCO3-先...(1/2)少量的NaOH和NH4HCO3反应过程中,会牵扯到OH-先和NH4+反应还是先和HCO3-反应,答案是先和HCO3-先反 反馈电路接地电阻的作用 煤油对皮肤有腐蚀性吗? 少量NAOH与NH4HCO3混合 OH先与NH4反应 还是先与HCO3反应 接地电阻测试卡的作用 沾了煤油的金属钠有没有腐蚀性化学课时、用镊子将煤油里的钠夹出来、想要放在滤纸上、因为紧张所以掉在了课桌上、因为当时嘴是张开的、感觉舌尖有刺痛(好像有烫的感觉)、请问有 NaOH通入到NH4HCO3中,OH-先和NH4+反应还是先和HCO3-反应?怎么判断? 化石的由来 300字急. 航空煤油和煤油对塑料和尼龙有腐蚀性吗? 化石是怎样形成的?请举例说明自然界的物种譬如鱼、树木等到一定的时间就自然腐烂,但若干年后怎么还会有其形状? 你好我想问怎么用紫外分光光度计测自制五水硫酸铜溶液中铜离子的浓度?常温下是溶在海水中的 ,我想知道溶液暴露在空气中放置24、48、72、96小时后 铜离子浓度会不会降低 这个是什么龙化石 请问下各位这个是什么化石. 大自然中有哪些事物能记录大自然的演变过程?如化石.多一点,至少2 测定溶液中铜离子含量的可行性方法,滴定法,分光光度计法? 向nh4hco3溶液中加过量的naoh溶液并加热.化学反应方程式怎么写?离子反应方程式呢?_ 在初一16课的《化石吟》中的大自然说的是化石还是大自然 紫外分光光度计可以检测多少种金属离子,是那些离子? 中国的龙,至今有没有发现其化石,或有力的证据证明它的存在? 硫酸亚铁铵中三价铁的限量分析步骤 可以用紫外分光光度计测氯离子含量吗?有没有具体的方法. 少量NaOH溶液滴入到NH4HCO3溶液中的离子反应 大学化学实验制备三草酸合铁酸钾,应该用哪种原料计算理论产量. 氢氧化钠与什么单质反应生成气体?没有其他的条件,除了si以外就没有了吗? 化石重现的世界是怎样的化石所重现逝去万载的世界是怎样的世界?沉睡亿年的石头说了什么话?(可以用生物课上或课外所获得的有关知识进行补充)《化石吟》 三草酸合铁酸钾的制备实验中,为什么采用标准加入法测定K+含量? 单质和氢氧化钠反应生成单质 世界上第一头恐龙的化石是哪一具 是什么龙 接地开关和接地短路器区别?他们是一种产品吗?作用是什么? 氢氧化钠与什么能反应生成单质 NH4HCO3与过量NaOH反应离子方程式不加热能否生成氨气?NH4HCO3双水解吗? 请问:设备除了保护接地外都还有什么接地,各有什么作用? 常温下碘单质与氢氧化钠反应生成什么 我的世界化石怎么做 井下保护接地网的作用是什么? 红光照到香蕉上,我们看到的香蕉是什么颜色?不是黑色实验时,用红光照射黄布,黄布为红色你说我选哪个? 3价铁离子和2价铁离子在什么时候区别?那曾青与铁反应的时候铁离子显2价还是3价?曾青的化学式是CUSO4 接地的目的和作用是什么?回答的时候不要用太随意的词语,最好用词如教科书一样. 有没有红香蕉? 怎样判断硫酸根离子,氯离子,碳酸根离子,铵根离子,2价铁离子,3价铁离子存在 琥珀化石的原理 这香蕉为什么是红色 如何检验和Fe3+Fe2+ 加什么能使Fe3+变成Fe2+或者使Fe2+变成Fe3+如何检验和Fe3+Fe2+加什么能使Fe3+变成Fe2+或者使Fe2+变成Fe3+ 最古老的化石是什么 琥珀的化石 化石形成过程 清华朱令中铊毒致100%伤残,铊究竟是什么? 琥珀是不是化石? 我想卖化石 什么化学物质可以解铊,如果铊中毒的表现是什么? 琥珀是怎样形成化石的? 有人要这块化石没有 铊标准溶液有毒吗 琥珀算是化石吗? 关于梦幻点化石!为什么我按5行相生,吸附石放前,怎么就吸不到东西!而我什么属性不看却吸出来一个,这是为什么啊?求个砖家讲解一下... 工作温度英文怎么简写 接地电阻测试点的作用是什么?为什么要预留了 具体的原理是?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘