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

如何使用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日在北京国家会议中心隆重举办。产业观察、技术培训、主题论坛、行业研讨,内容丰富,干货十足。 需要购买的朋友,请抓住这最后的机会,点击报名!

让TextBox的输入具备overwrite(覆盖)的功能 -VB资料 让密码轻松显示 -VB资料 让文本框输入完后,直接跳入下一行 -VB资料 VB如何编制带有不定个数参数的过程。 VB如何充分扩充VB功能 VB如何传递不固定个数的叁数? VB如何打开和关闭光驱门 VB如何导出收藏夹到文件或者导入文件到收藏夹 VB如何得到磁盘上剩余空间的值 VB如何得到应用程序的资料! VB如何调用chm格式的帮助文件 VB如何调用控制面版中的应用程序 VB如何动态更新数据报表 VB如何改变 NT 预设的打印机? VB如何改变 Windows 预设的打印机 VB如何关闭其他程序 VB如何过滤键盘录入 VB如何获得Windows95已经运行的时间 VB如何检测左右键同时按下? VB如何检查您的电脑是否打开 ActiveDesktop? VB如何将程序建立成“启动”文件夹的捷径? VB如何将程序建立成「启动」资料夹的捷径。 VB如何结束 Shell 所启动的程序? VB如何拦截键盘输入 如何判定VB调用的一个EXE程序已经结束. VB如何判断某一个Drive是否为光碟机? VB如何清空回收站? VB如何取得汉字的区位码 VB如何去优化你的VB程序 VB如何让点阵打印机每次印出一行? VB如何设计一个可中断循环的按钮。 大虾请出手,CTreeCtrl 的item项被点击时,得知当前点击的为那一项,谢谢,谢谢 请问在JBuilder中怎么调整控件的位置好啊? 怎么在非客户区添加个按钮?遮住最大化按钮呢?我头都想炸了 请问如何查看WIN2000系统里是否被安装了类似“冰河”之类的软件? 如何打印整个对话框 寻找将realplay录像(ram格式文件)转换成mpeg或avi的软件。 OTDR(TD3000)的接口编程,谁做过!!!!!!!!!!!!请进 百分求方案!!请大家不吝赐教!(报表汇总,打印相关,有一定难度!!!) 干掉最大化按钮! 谁能帮我解释一下Petzold这些话的意思: 绝对给分,谢谢各位大侠帮我解决这个很简单的问题罗!:( 关于古老的DDE通信的几个头痛的问题. yangrenzhi你今天怎么啦,有事就说出来啊 如何获得一个变量的字节长度 关于JAVA的简单问题(送分) 为什么不能筛选数据? 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 我有一个问题大家帮我UP一下 用HTML可以制作留言版吗?有使用mailto的吗? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! 一辆玩具车在一条直线上跑,先向后跑了6米,记作-6米,那么玩具车又跑了+6米是什么意思?这时它离移动前的位置有多远? 20mL 0.1mol/L的CH3COOH溶液中和10mL 0.1mol/L NaOH溶液 请列出所有粒子的浓度大到小?请说明为什么这样排 中和100mL 1mol/L的H2SO4溶液,需要多少g 1.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车101.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车10并车11车钟12一车13二车14三车 常温下,用0.1MOL/L的NAOH滴定20ML.0.1MOL/L的HAC溶液.当V(NAOH)=10ML时.溶液中:C(AC-)+2C(OH-)=C(HAC)+2C(H+) 为什么是对的? 中和100ml 1mol/L的硫酸 需要多少的NaOH? 朗逸车LAVIDA1.6下面一排小的英文是什么意思 0.1mol/L的硫酸20mL与0.2mol/L的硫酸10mL混合,求混合液物质的量浓度用0.6mol/L的NaOH溶液A与0.1mol/L的溶液B混合配制0.2mol/L的NaOH溶液,求A与B的体积比 用20ml0.2mol/L的NAOH溶液中和0.1mol/L硫酸溶液,需要盐酸溶液的体积是多少? 一瓶葡萄糖盐水是多少毫升?实际调查噢! 将20ml 0.1mol/L NaOH 溶液和 10ml 0.1 mol/L CH3COOH 溶液混合后并加强热,最终得到的固体是?答案是Na2CO3 等体积的o.1mol/L盐酸,硫酸,用o.1mol/L氢氧化钠溶液中和,当恰好完全反应时,消耗NAOH溶液体积的大小 5%葡萄糖注射液 500ml 【规格】:500ml,25g 该注射液中葡萄糖的物质的量浓度为5%葡萄糖注射液 500ml【规格】:500ml,25g该注射液中葡萄糖的物质的量浓度为____. 现有25ml盐酸和硫酸的混合液,加入1mol/L的NaOH溶液25ml恰好中和,在中和后的溶液中加过量的Ba(OH)2溶液,所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度各是多少? 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液的体积我知道答案就是不明白为什么分Al离子过量和OH根过量 求该注射液中葡萄糖的物质的量浓度.葡萄糖(C6H12O6) 将100毫升0.2mol/l的NaOH溶液与多少毫升的0.1Mol/L的硫酸溶液混合,才能恰好完全中和 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液多少毫升?当OH-过量时为什么 Al3+是0.02mol?谁给我讲明白追加20 我Q 10561252 医用葡萄糖注射液的葡萄糖的质量分数为5%.密度约为1g/cm³,则此注射液中葡萄糖的物质的量浓度是多少希望稍微详细点 中和100ml 1mol/l的硫酸,需要多少氢氧化钠(质量)? 在100ml 1mol/L盐酸溶液中加入50ml,1mol/L氢氧化钠溶液后,将反应后溶液加水稀释至500ml,则稀释后溶液的PH值是多少? 500ML的葡萄糖注射液,重量是多少克(大概)?这种葡萄糖注射液的葡萄糖浓度是多少? 2mol/L的硫酸100ml能与多少毫升1mol/L的氢氧化钠完全中和 0.1mol/l的HCL与0.1mol/lNaOH反应多滴一滴NaOH(0.05ml)将溶液稀释50ml 问溶液PH值 500ml水中含有25g葡萄糖,该葡萄糖溶液的质量分数 完全中和100ml、0.1mol/L的硫酸溶液、需要0.05mol/L的氢氧化钠溶液多少毫升 将一定质量的MgAl合金全部溶解在500mL盐酸中(体积变化不计),取10mL反应后的溶液,用1mol/LNaOH溶液滴定得下图关系.(1)求Mg,Al质量各是多少?(2)求盐酸的物质的量浓度为多少mol/L? 500ml内含葡萄糖25g,先要配制20kg这种葡萄糖注射液,需要葡萄糖多少千克? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,再滴加1mol·L-1氢氧化钠溶液,若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,请回答(1)无视镁铝比例如何 实验室需要0.1mol/LNaOH溶液450mL和0.5mol/L的硫酸溶液500mL.根据这两种溶液的配制情况回答下列问题.根据这两种溶液的配制情况回答下列问题.用质量分数为98%密度为1.84g/m³的浓硫酸体积为 15分之8除6分之1表示的意义是什么 5%葡萄糖(C6H12O6)注射液 500mL 【性状】………… 【规格】500mL,25g 1)该葡萄糖注射液中葡萄糖的质量不明白质量分数的计算中是否应当再次加上水的质量,若加了,就变成百分之4.8,若不加则为 将0.1mol的镁铝混合物溶于100ml 2mol/L的H2SO4中,然后滴加1mol/L的NaOH溶液,请回答:⑴若在滴加NaOH溶液的过程中欲使Mg2+、Al3+刚好沉淀完全,则滴入NaOH溶液体积为________ml⑵若混合物仍为0.1mol其中 31,11,36,6,41,1,46,是什么意思46后面应该是-4么? 5%葡萄糖(C6H12O6)注射液 规格:500ml 25g 求该注射液中葡萄糖的物质的量浓度为多少?该注射液的质量分数是多少? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,然后再滴加1mol·L-1氢氧化钠溶液,请回答以下问题:若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,金属粉 NBA总决赛,看到有个标语41>6+3+1是什么意思?是指诺维斯基?具体意思? 将25g葡萄糖溶于水,配成500ml溶液该溶液的质量浓度为多少 将镁铝混合物0.1mol溶于100ml2mol/l的硫酸溶液中,然后在滴加2mol/l亲氧化钠溶液 1.2 1.6 2. 如何用含结晶水的葡萄糖C6H12O6·H2O配制质量为50.0g/L的葡萄糖溶液500mL?设溶液密度为1kg/L,该溶液的物质 将0.1mol镁、铝合金溶于100mL2mol/L的H2SO4溶液中,然后滴加1mol/L的NaOH溶液,生成沉淀与所加NaOH溶液体积的关系如图所示当溶液中Mg2+、Al3+恰好沉淀完全时,V(NaOH)=当V1=160mL时,金属粉末中镁的物质 5串1或5串6这些是什么意思 您好 请问如何用含结晶水的葡萄糖配置质量浓度为50g/L的葡萄糖溶液500ml? 某种未知浓度NaOH的溶液25ml,加入20ml,1mol/L的H2SO4溶液后显酸性.再滴入1mol/L ,KOH溶液1.5mL,恰好呈中性.计算NaOH溶液的物质的量浓度 5-5-6-5-1代表什么意思 二氧化硫和氧气化合 催化剂是什么? 现有25mlHCl和H2SO4的混合液,加入1mol.L^-1的NaOH溶液25ml恰好中和,在中和后的溶液中加入过量的Ba(OH)2溶所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度 1.2.3.4.5.6. SO2与O2的混合气体中,O2的体积分数是50%,则该混合气体在标准状况下的密度是 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需用0.5mol/L的NaOH溶液20ml才能恰好中和.求该盐酸溶液物质的浓度? 10转6股派1. 在标准状况下.2.24升二氧化硫和氧气的混合气体中所含的氧原子数为多少?怎么算的 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需要0.5mol/L的NaOH溶液20m求该盐酸的溶液的物质的量浓度 六串一什么意思 要出去氧气中混有的二氧化硫气体,最好让混合气体通过A 浓硫酸 B 氢氧化钠溶液 C 澄清石灰水 D 蒸馏水 为什么? 100mL 0.1mol/L 的两溶液中和等物质的量的氢氧化钠关于盐酸和醋酸说法正确的是:100mL 0.1mol/L 的两溶液能中和等物质的量的氢氧化钠 ?这句话对吗?为什么? 每辆汽车后面都有一个小数(比如说1.6).这个小数代表什么 10ml 0.1mol/L HCL 与10ml 0.2mol/L NaOH混合,求该混合溶液的PH值. 100mL 1MOL/l氢氧化钠溶液与100mL 1mol/L的硫酸溶液恰好中和
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn