1、Why Lucene/Solr Why Lucene/Solr James Tang(james@) 1. 简介 搜索引擎已经为几乎所有人所熟知,像Google, 百度这样的公共搜索引擎几乎成了日常互联网消费品。但搜索引擎背后的技术很少有人关心,而搜索引擎技术也并不像使用Google那样简单直接,在Google首页的输入框中输入关键字之后,需要成千上万的服务器经过多道工序才能返回我们需要的结果。虽然我们在此并不打算讨论Google这样的复杂的系统,但搜索引擎的工作基本原理有必要在此讨论一下,以为下面的讨论提供一点基础。 搜索引擎所涉及到的技术包括数据结构、数据分析、数据处理、数据存储
2、及搜索等,这些技术统称为数据检索(Information retrieval, IR)[1]。搜索引擎的种类众多,用途各异,但我们这里专注于Web搜索引擎。一个完整的Web搜索引擎由多个部分组成,如图一所示: 图一 搜索引擎基本架构 图一中红色部分是本文讨论的重点,也是Lucene/Solr的核心,浅蓝色部分为应用需要考虑的部分。 在构建文档阶段,需要考虑的主要技术有分词(Tokenizing)、停用词(Stopping word)、词干分析(Stemming)等,这些技术要素也是我们首要考虑的因素。除此以外,还有链接抽取及分析、语义分析、信息分类等技术是其它公共搜索引擎需要重点考虑
3、的问题。 在索引建立阶段,主要技术有文档统计、权重、转换(Inversion)等。 在查询处理阶段,需要考虑查询结语评级(Ranking),性能评估等。 1.1. Lucene Lucene[2]是一个基于Java开发的免费、开源、高性能、可扩展的IR程序库,并且是目前应用最为广泛的IR程序库。很多人可能误认为Lucene是一个可以马上使用的搜索程序,而事实上Lucene仅仅是提供了简单而又强大的索引与搜索功能的搜索组件。Lucene并不关心数据源、数据格式、甚至数据的语言,Lucene更不会关心搜索的界面会是怎样,这些工作都是由基于Lucene的程序来完成,因此Lucene使用于几乎
4、所有以文本内容为主的数据检索功能,全球成千上万、类型各异、数据规模从少量到海量的应用与网站的成功案例[3],足以证实这一点。 1.2. Solr Solr[4]是基于Lucene的功能较为完善的企业级搜索服务器。前面提到Lucene主要实现索引和查询的核心功能及API,但并不是一个完整的产品,而Solr实现了一些常用扩展并提供基于HTTP的Web服务,并且提供灵活的Schema配置、多核心支持、面搜索(Faceted Search)等。对于不是以Java为主要开发语言的项目来说,Solr可以非常快速、有效地集成搜索服务。 1.3. IK Analyzer IK Analyzer[5],
5、 是一个开源的,基于java语言开发的轻量级的中文分词工具包。它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。 2. 特性 Lucene最主要特性总结如下: l 适应所有全文索引与搜索的能力 l 内部逻辑采用文本域(fields of text)的文档结构,使API不依赖于数据源格式,所以灵活性高 l 适应网络、本地等多种应用搜索
6、需求 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
7、 l 缓存支持(Caching) IK Analyzer在中文分词方面主要有以下特性: l 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式 l 高速中文分词处理能力 l 智能分词模式支持简单的分词排歧义处理和数量词合并输出 l 采用多子处理器分析模式,支持英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符 l 优化的词典存储,更小的内存占用 l 支持用户词典扩展定义 l 词典支持中文,英文,数字混合词语 3. 性能 由于我们的系统架构将采用Solr而不是直接基于Lucene开发,但Solr核心是Lucene所以Lucene的性能测试也至关重
8、要。下面是来自第三方[7]的测试结果可供参考,该结果不仅对Lucene作了性能测试,还与其它搜索引擎作了对比。图二为技术及总体评级。 图二 Lucene及其它搜索引擎程序总体对比 3.1. 索引性能 下面图三是[7]基于Twitter数据的索引测试结果,从图中可以看出,在[7]的测试环境下,索引速度在1427KB/s,在没有测试环境信息的情况下,从对比结果可以看出Lucene索引速度是表现不错的。另外注意到,Lucene的索引大小是唯一一个小于源数据大小的,因此综合表现应该是很出色的。 图三 Lucene及其它搜索引擎索引测试对比 3.2. IK Analyzer性能 下面
9、是来自官方的测试数据: 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为比较相
10、关,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容器:Tomca
11、t 6 但由于该服务器同时运行了多个服务(如DNS, MySQL, Nginx, JIRA等),同时为了避免影响其它服务正常运行,并且由于时间关系没有进行长时间压力测试,所以测试数据仅供参考,在实际生产环境中,Solr一般采用独立一台或多台服务器,因此性能要优于我们的测试服务器。 下面测试以一次常规查询为基准,测试时Solr索引数量及主要配置如图五所示: 图五 测试服务器Solr索引状态 l 索引数量:51万(如图五numDocs所示) l 测试工具:Apache Benchmark 2.3 l 测试URL: http://qikan.dev:8080/solr/qikan/s
12、elect/?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 一次查询数
13、量: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/Slo
14、r在生产环境中有出色的表现。 图六 Solr AB测试结果示例(n=9000, c=100) 4. 扩展性 扩展性我们主要需要考虑因素为Solr能否满足用户规模的增长、能否满足新功能的实现。事实上Solr充分考虑到了这些因素,总结如下: l Lucene/Solr提供了分词接口及插件扩展功能,可以根据需求实现自定义的分词分析器 l Lucene/Solr支持非常灵活的查询语法及查询接口,可以快速方便地实现不同的搜索功能 l 当用户量增加时,可以方便地通过Solr集群及内容分区来实现QPS及容量扩展 5. 灵活性 灵活性对于搜索引擎而言,主要应该体现在对数据多种数据源的支持、
15、快速的响应需求变化、提供个性化的查询接口等。在此我们一一讨论Solr这灵活性方面的表现,但并不局限于以下方面: l 丰富的灵活的查询语法 l 基于XML的Solr Schema及动态域(Fields)支持 l 基于域及值区间的面搜索(Faceted search) 6. 成本 第一,Lucene/Solr为免费开源产品,因此无须任何产品授权费用。 第二,虽然Lucene/Solr为开源产品,但已经非常成熟、稳定、可靠,因此完全可以依赖。 第三,经过多年的发布,Lucene/Solr已经有非常丰富的应用经验及社区支持,所以大部分问题都能快速得到解决。 第四,服务器没有特殊要求。
16、 最后,Lucene/Solr开发与部署并不复杂,可以快速实现搜索应用。 基于以上几点,无论是在开发周期、硬件、人员配置方面都没有高昂的成本,相反,比自主研发或购买商业方案成本更低。 7. 谁在用 不是诉诸权威,而是为了强调Lucene/Solr的灵活性、可扩展性。任何公司及个人在选择产品时首选当然是成熟、认可度高、稳定性好的产品。这些成功案例不仅为我们采用Lucene/Solr提供了足够信心依据,同时也是很好的应用参考及借鉴。 IBM的多种产品,如DeveloperWorks都有少量内容提供给内部及全球用户使用,其搜索服务采用了Lucene很好地实现各种搜索功能。 AOL第天有大量
17、的新闻内容需要索引,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
18、 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.
19、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






