资源描述
Why Lucene/Solr
Why Lucene/Solr
James Tang(james@)
1. 简介
搜索引擎已经为几乎所有人所熟知,像Google, 百度这样的公共搜索引擎几乎成了日常互联网消费品。但搜索引擎背后的技术很少有人关心,而搜索引擎技术也并不像使用Google那样简单直接,在Google首页的输入框中输入关键字之后,需要成千上万的服务器经过多道工序才能返回我们需要的结果。虽然我们在此并不打算讨论Google这样的复杂的系统,但搜索引擎的工作基本原理有必要在此讨论一下,以为下面的讨论提供一点基础。
搜索引擎所涉及到的技术包括数据结构、数据分析、数据处理、数据存储及搜索等,这些技术统称为数据检索(Information retrieval, IR)[1]。搜索引擎的种类众多,用途各异,但我们这里专注于Web搜索引擎。一个完整的Web搜索引擎由多个部分组成,如图一所示:
图一 搜索引擎基本架构
图一中红色部分是本文讨论的重点,也是Lucene/Solr的核心,浅蓝色部分为应用需要考虑的部分。
在构建文档阶段,需要考虑的主要技术有分词(Tokenizing)、停用词(Stopping word)、词干分析(Stemming)等,这些技术要素也是我们首要考虑的因素。除此以外,还有链接抽取及分析、语义分析、信息分类等技术是其它公共搜索引擎需要重点考虑的问题。
在索引建立阶段,主要技术有文档统计、权重、转换(Inversion)等。
在查询处理阶段,需要考虑查询结语评级(Ranking),性能评估等。
1.1. Lucene
Lucene[2]是一个基于Java开发的免费、开源、高性能、可扩展的IR程序库,并且是目前应用最为广泛的IR程序库。很多人可能误认为Lucene是一个可以马上使用的搜索程序,而事实上Lucene仅仅是提供了简单而又强大的索引与搜索功能的搜索组件。Lucene并不关心数据源、数据格式、甚至数据的语言,Lucene更不会关心搜索的界面会是怎样,这些工作都是由基于Lucene的程序来完成,因此Lucene使用于几乎所有以文本内容为主的数据检索功能,全球成千上万、类型各异、数据规模从少量到海量的应用与网站的成功案例[3],足以证实这一点。
1.2. Solr
Solr[4]是基于Lucene的功能较为完善的企业级搜索服务器。前面提到Lucene主要实现索引和查询的核心功能及API,但并不是一个完整的产品,而Solr实现了一些常用扩展并提供基于HTTP的Web服务,并且提供灵活的Schema配置、多核心支持、面搜索(Faceted Search)等。对于不是以Java为主要开发语言的项目来说,Solr可以非常快速、有效地集成搜索服务。
1.3. IK Analyzer
IK Analyzer[5], 是一个开源的,基于java语言开发的轻量级的中文分词工具包。它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
2. 特性
Lucene最主要特性总结如下:
l 适应所有全文索引与搜索的能力
l 内部逻辑采用文本域(fields of text)的文档结构,使API不依赖于数据源格式,所以灵活性高
l 适应网络、本地等多种应用搜索需求
l 技术成熟,得到广泛验证及认可
Solr基于Lucene,所以除了具有以上特性外,还具备:
l 面搜索(Faceted search)支持
l 关键字高亮(Highlight)
l 多种HTTP输出格式支持,包括JSON, XML, PHP, Ruby, Python, XSLT等
l Web管理界面
l 多服务器数据复制(Replication) ——提供良好 QPS(Queries Per Second)扩展
l 内容分区(Sharding)搜索支持——提供良好的容量扩展
l 支持基于Carrot2[6]的搜索集群服务
l 支持扩展插件,如IK Analyzer
l 缓存支持(Caching)
IK Analyzer在中文分词方面主要有以下特性:
l 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式
l 高速中文分词处理能力
l 智能分词模式支持简单的分词排歧义处理和数量词合并输出
l 采用多子处理器分析模式,支持英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
l 优化的词典存储,更小的内存占用
l 支持用户词典扩展定义
l 词典支持中文,英文,数字混合词语
3. 性能
由于我们的系统架构将采用Solr而不是直接基于Lucene开发,但Solr核心是Lucene所以Lucene的性能测试也至关重要。下面是来自第三方[7]的测试结果可供参考,该结果不仅对Lucene作了性能测试,还与其它搜索引擎作了对比。图二为技术及总体评级。
图二 Lucene及其它搜索引擎程序总体对比
3.1. 索引性能
下面图三是[7]基于Twitter数据的索引测试结果,从图中可以看出,在[7]的测试环境下,索引速度在1427KB/s,在没有测试环境信息的情况下,从对比结果可以看出Lucene索引速度是表现不错的。另外注意到,Lucene的索引大小是唯一一个小于源数据大小的,因此综合表现应该是很出色的。
图三 Lucene及其它搜索引擎索引测试对比
3.2. IK Analyzer性能
下面是来自官方的测试数据:
l CPU: Core2 i7 3.4G双核,
l 内存:4G,
l 操作系统:Window 7 64位
l Java:Sun JDK 1.6_29 64
测试结果:
l 160万字/秒(3000KB/S)
从测试结果可以估计,IK Analyzer完全能满足大规模索引分词的需求,并不会对Solr索引速度造成明显影响。
3.3. 查询性能
对于查询我们主要关心查询速度及搜索结果相关度,图四是[7]的查询测试结果及基于TREC-9的查询相关性分析。从图中看出虽然Lucene的查询速度不是最快,但表现也很好。特别注意到相关性是最好的(2为最相关,1为比较相关,0为完全不相关),从综合表现可以看出Lucene表现依然很出色。
图四 Lucene及其它搜索引擎索引测试对比
另外对于查询性能,我们基于我们的测试环境进行了本地测试,以便对[7]的测试结果有一个更直观的认识。下面测试数据来自我们的测试服务器,该测试服务器的基本配置如下:
l CUP:1个Intel(R) Xeon(R) E5606 2.13GHz,4核心
l RAM:8GB, 测试时可用内存2.9GB
l 硬盘:500G, RAID 1
l 操作系统:CentOS 6.3 x64
l Java版本:OpenJDK 1.6.0_24
l Servlet容器:Tomcat 6
但由于该服务器同时运行了多个服务(如DNS, MySQL, Nginx, JIRA等),同时为了避免影响其它服务正常运行,并且由于时间关系没有进行长时间压力测试,所以测试数据仅供参考,在实际生产环境中,Solr一般采用独立一台或多台服务器,因此性能要优于我们的测试服务器。
下面测试以一次常规查询为基准,测试时Solr索引数量及主要配置如图五所示:
图五 测试服务器Solr索引状态
l 索引数量:51万(如图五numDocs所示)
l 测试工具:Apache Benchmark 2.3
l 测试URL: http://qikan.dev:8080/solr/qikan/select/?rows=100&version=2.2&indent=on&wt=json&fq=meta_class_identifier_ms:magazine_article&sort=meta_published_dt+desc&q=*%3A*&start=0&rows=10&fl=attr_author_t,attr_title_t,meta_main_node_id_si,meta_main_path_string_ms,meta_main_parent_node_id_si,meta_published_dt,meta_id_si,meta_node_id_si
l 一次查询数量:100条
l 文档大小:3210KB
图六是一次测试结果示例,本次测试请求数量为1000,并发为1:
图六 Solr AB测试结果示例(n=1000, c=1)
上面的测试经过多次反复测试(分别更行了请求次数n=1000, 10000, 100000,并发c=1, 100, 500的测试),同一请求数量及并发的结果基本一致(第次结果误差没有超过1ms)。从我们的测试结果看出,在我们的测试服务器上,第次请求时间为12.360ms,与[7]的测试结果0.02168s,即21.68ms相比快很多,说明[7]的测试环境定不优于我们测试服务器。因此我们有足够的信心相信Lucene/Slor在生产环境中有出色的表现。
图六 Solr AB测试结果示例(n=9000, c=100)
4. 扩展性
扩展性我们主要需要考虑因素为Solr能否满足用户规模的增长、能否满足新功能的实现。事实上Solr充分考虑到了这些因素,总结如下:
l Lucene/Solr提供了分词接口及插件扩展功能,可以根据需求实现自定义的分词分析器
l Lucene/Solr支持非常灵活的查询语法及查询接口,可以快速方便地实现不同的搜索功能
l 当用户量增加时,可以方便地通过Solr集群及内容分区来实现QPS及容量扩展
5. 灵活性
灵活性对于搜索引擎而言,主要应该体现在对数据多种数据源的支持、快速的响应需求变化、提供个性化的查询接口等。在此我们一一讨论Solr这灵活性方面的表现,但并不局限于以下方面:
l 丰富的灵活的查询语法
l 基于XML的Solr Schema及动态域(Fields)支持
l 基于域及值区间的面搜索(Faceted search)
6. 成本
第一,Lucene/Solr为免费开源产品,因此无须任何产品授权费用。
第二,虽然Lucene/Solr为开源产品,但已经非常成熟、稳定、可靠,因此完全可以依赖。
第三,经过多年的发布,Lucene/Solr已经有非常丰富的应用经验及社区支持,所以大部分问题都能快速得到解决。
第四,服务器没有特殊要求。
最后,Lucene/Solr开发与部署并不复杂,可以快速实现搜索应用。
基于以上几点,无论是在开发周期、硬件、人员配置方面都没有高昂的成本,相反,比自主研发或购买商业方案成本更低。
7. 谁在用
不是诉诸权威,而是为了强调Lucene/Solr的灵活性、可扩展性。任何公司及个人在选择产品时首选当然是成熟、认可度高、稳定性好的产品。这些成功案例不仅为我们采用Lucene/Solr提供了足够信心依据,同时也是很好的应用参考及借鉴。
IBM的多种产品,如DeveloperWorks都有少量内容提供给内部及全球用户使用,其搜索服务采用了Lucene很好地实现各种搜索功能。
AOL第天有大量的新闻内容需要索引,Solr同样能够满足其需求。
LinkedIn是全球最大的职业社交网络,而其庞大的用户关系网络、内容数据搜索都是基于Lucene来完成的。
Twitter是微博的始祖,他基于Lucene实现在实时内容搜索。
8. 参考
[1] Search Engines: Information Retrieval in Practice, W.Bruce Croft, Donald Metzler, Trevor Strohman
[2] Lucene Home Page, http://lucene.apache.org/
[3] Applications and web applications using Lucene, http://wiki.apache.org/lucene-java/PoweredBy
[4] Solr Home Page, http://lucene.apache.org/solr/
[5] IK Analyzer Project,
[6] Carrot2, http://project.carrot2.org/
[7] A Comparison of Open Source Search Engines, Christian Middleton, Ricardo Baeza-Yates, http://wrg.upf.edu/WRG/dctos/Middleton-Baezahttp://wrg.upf.edu/WRG/dctos/Middleton-Baeza.pdf
[8] TREC9, http://trec.nist.gov/pubs/trec9/t9_proceedings.html
[] Solr wiki, http://wiki.apache.org/solr/FrontPage
[] A Comparison of Open Source Search Engines, Vik Singh,
[] Public Websites using Solr, http://wiki.apache.org/solr/PublicServers
9 / 9
展开阅读全文