Lucene-Solr简介 联系客服

发布时间 : 星期二 文章Lucene-Solr简介更新完毕开始阅读49905ae7f8c75fbfc77db290

Why Lucene/Solr

Why Lucene/Solr

James Tang(james@fwso.cn)

1. 简介

搜索引擎已经为几乎所有人所熟知,像Google, 百度这样的公共搜索引擎几乎成了日常互联网消费品。但搜索引擎背后的技术很少有人关心,而搜索引擎技术也并不像使用Google那样简单直接,在Google首页的输入框中输入关键字之后,需要成千上万的服务器经过多道工序才能返回我们需要的结果。虽然我们在此并不打算讨论Google这样的复杂的系统,但搜索引擎的工作基本原理有必要在此讨论一下,以为下面的讨论提供一点基础。

搜索引擎所涉及到的技术包括数据结构、数据分析、数据处理、数据存储及搜索等,这些技术统称为数据检索(Information retrieval, IR)[1]。搜索引擎的种类众多,用途各异,但我们这里专注于Web搜索引擎。一个完整的Web搜索引擎由多个部分组成,如图一所示:

图一 搜索引擎基本架构

图一中红色部分是本文讨论的重点,也是Lucene/Solr的核心,浅蓝色部分为应用需要考虑的部分。 在构建文档阶段,需要考虑的主要技术有分词(Tokenizing)、停用词(Stopping word)、词干分析(Stemming)等,这些技术要素也是我们首要考虑的因素。除此以外,还有链接抽取及分析、语义分析、信息分类等技术是其它公共搜索引擎需要重点考虑的问题。

1 / 8

Why Lucene/Solr

在索引建立阶段,主要技术有文档统计、权重、转换(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最主要特性总结如下:

? 适应所有全文索引与搜索的能力

? 内部逻辑采用文本域(fields of text)的文档结构,使API不依赖于数据源格式,所以灵活性高 ? 适应网络、本地等多种应用搜索需求 ? 技术成熟,得到广泛验证及认可

Solr基于Lucene,所以除了具有以上特性外,还具备: ? 面搜索(Faceted search)支持 ? 关键字高亮(Highlight)

2 / 8

Why Lucene/Solr

? 多种HTTP输出格式支持,包括JSON, XML, PHP, Ruby, Python, XSLT等 ? ? ? ?

Web管理界面

多服务器数据复制(Replication) ——提供良好 QPS(Queries Per Second)扩展 内容分区(Sharding)搜索支持——提供良好的容量扩展 支持基于Carrot2[6]的搜索集群服务

? 支持扩展插件,如IK Analyzer ? 缓存支持(Caching)

IK Analyzer在中文分词方面主要有以下特性:

? 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式 ? 高速中文分词处理能力

? 智能分词模式支持简单的分词排歧义处理和数量词合并输出 ? 采用多子处理器分析模式,支持英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符 ? 优化的词典存储,更小的内存占用 ? 支持用户词典扩展定义

? 词典支持中文,英文,数字混合词语

3. 性能

由于我们的系统架构将采用Solr而不是直接基于Lucene开发,但Solr核心是Lucene所以Lucene的性能测试也至关重要。下面是来自第三方[7]的测试结果可供参考,该结果不仅对Lucene作了性能测试,还与其它搜索引擎作了对比。图二为技术及总体评级。

图二 Lucene及其它搜索引擎程序总体对比

3.1. 索引性能

下面图三是[7]基于Twitter数据的索引测试结果,从图中可以看出,在[7]的测试环境下,索引速度在1427KB/s,

3 / 8

Why Lucene/Solr

在没有测试环境信息的情况下,从对比结果可以看出Lucene索引速度是表现不错的。另外注意到,Lucene的索引大小是唯一一个小于源数据大小的,因此综合表现应该是很出色的。

图三 Lucene及其它搜索引擎索引测试对比

3.2. IK Analyzer性能

下面是来自官方的测试数据: ? CPU: Core2 i7 3.4G双核, ? 内存:4G,

? 操作系统:Window 7 64位 ? Java:Sun JDK 1.6_29 64 测试结果:

? 160万字/秒(3000KB/S)

从测试结果可以估计,IK Analyzer完全能满足大规模索引分词的需求,并不会对Solr索引速度造成明显影响。

3.3. 查询性能

对于查询我们主要关心查询速度及搜索结果相关度,图四是[7]的查询测试结果及基于TREC-9的查询相关性分析。从图中看出虽然Lucene的查询速度不是最快,但表现也很好。特别注意到相关性是最好的(2为最相关,1为比较相关,0为完全不相关),从综合表现可以看出Lucene表现依然很出色。

4 / 8