如何使用15美元每月的机器实现百万文档检索
来源:互联网 发布:java飞机大战花式子弹 编辑:程序博客网 时间:2024/05/09 06:55
【编者按】如何在廉价机器上运行一个超过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。”
- 如何使用15美元每月的机器实现百万文档检索
- 如何使用15美元每月的机器实现百万文档检索
- 使用tf*idf实现对文档集合的检索
- 使用activePDF Toolkit如何检索文档信息
- 如何使用C\C++实现文件的检索 ?
- 如何使用C\C++实现文件的检索 ?
- 如何使用C\C++实现文件的检索 ?
- 如何使用 MFC 检索 Office 文档中的宏名称的列表
- 如何使用 MFC 检索 Office 文档中的宏名称的列表
- 使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现
- 如何赚到百万美元之:行动起来篇
- 葡萄酒网站Lot18:如何6个月内赚取百万美元
- 技术小白如何把初创电商卖了百万美元?
- 如何实现检索结果的检索词变色
- mysql 全文检索 百万条记录的快速检索
- 《百万美元宝贝》
- 《百万美元宝贝》
- 如何实现数据窗口的分页检索?
- dfgsa
- kNN分类器 (k nearest neighborhood classifier)
- 移动支付帝国战:谷歌、苹果、Facebook、亚马逊孰胜孰负?
- Delphi的学习笔记——类
- 《Rework》摘录及感想
- 如何使用15美元每月的机器实现百万文档检索
- 【C语言】14-返回指针的函数与指向函数的指针
- Jquery easyui tree 一些常见操作
- DHCP协议交互过程分析
- 详细介绍JAVA和C++区别
- 模式识别 - 处理特征数据 及 代码
- how to convert varchar to float in mysql
- Hadoop简介(1):什么是Map/Reduce
- redis的windows安装记录