290 likes | 606 Views
FirteX -高性能全文索引和检索平台. 中科院计算所 智能软件部 信息智能中心 郭瑞杰 ruijieguo@software.ict.ac.cn 2006.6.21. Outline. FirteX 介绍 已有平台介绍 Lucene 、 Lemur 等 FriteX 的架构 FirteX 的具体实现 索引、索引存储和检索 FirteX VS Lucene&Lemur 结论和进一步工作. FirteX 介绍. 开放式架构: 采用标准 C++ 实现,支持 Windows , Unix-like 操作系统;
E N D
FirteX-高性能全文索引和检索平台 中科院计算所 智能软件部 信息智能中心 郭瑞杰 ruijieguo@software.ict.ac.cn 2006.6.21
Outline • FirteX介绍 • 已有平台介绍 • Lucene、Lemur等 • FriteX的架构 • FirteX的具体实现 • 索引、索引存储和检索 • FirteX VS Lucene&Lemur • 结论和进一步工作
FirteX介绍 • 开放式架构: • 采用标准C++实现,支持Windows,Unix-like 操作系统; • 实验和工程的通用平台,不仅是一个检索系统,同时也是一个全文索引和检索框架 • 多个组件基于插件设计,不仅可以采用C/C++对系统进行扩展,也可以通过内置的跨平台COM库设计COM组件来扩展系统 。 • 功能: • 支持增量索引,差量索引,多字段索引,提供了3种前向索引方式; • 支持纯文本,HTML,PDF等文件格式; • 提供快速中文分词; • 从底层到高层,提供了多种索引访问接口,灵活自由地使用索引文件; • 提供丰富的检索语法,支持多字段检索,日期范围检索,检索结果自定义排序等。 • 性能: • 在Pentium 4 2.8G 2GRAM的机器上超过200Mb每分钟的索引速度 • 在近7G的索引文件(100G网页,11G纯文本的索引)上检索,仅使用十几M内存在数毫秒内返回查询结果; • 支持Tb数量级的文本索引和检索 • 灵活性: • 对于简单的使用者: • 直接提供了多种文件格式解析器(HTML,PDF,WORD等); • 系统采用类似于XML格式的配置文件,可以根据数据集和机器配置情况,灵活配置整个系统,无需编写代码。 • 对于研究人员: • 提供了TREC文档集解析器; • 检索模型易于扩展; • 提供了3种前向索引方式,可以直接用来做文本分类、聚类,摘要等 实验; • 对于开发者: • 系统各组成部分耦合性低,从应用层模块到系统核心层模块,均可单独修改、升级或替换;扩展既可以在源代码上直接进行,也可以使用非C/C++语言通过COM组件扩展
已有平台介绍-Lemur • Lemur: • 采用C++开发的一个语言模型和信息检索的工具包 • 支持Unix,Linux,Windows等操作系统 • 主要针对研究领域,包括全文索引、检索、分布式信息检索、文档聚类,摘要等 • 全文索引部分包含InvIndex、InvFPIndex、KeyfileIndex和Indri 四种索引方式 • 支持多种检索模型,用户也可以比较容易扩展自己的检索模型 • 能够很方便地搭建自己的信息检索实验平台,实现各种信息检索模型或其他文本处理实验
已有平台介绍-Lemur(续) • 采用动态词典,将词编码成数字ID序列 • 动态词典容易膨胀,不同文档集建的索引无法兼容 • 采用了内存池,先在内存中建索引,再写至磁盘 • 内存中没有压缩,中间临时文件无法提供检索(InvFPIndex) • 架构并非是开放式的,索引部分不易扩展 • 用户很难扩展新的索引算法,索引压缩算法等 • 没有考虑太多的性能问题,不能满足一些对索引和检索时效性比较高的应用 • 虽然能够支持中文,但是还不够充分,只提供了单字切分,使用者还必须做很多分词的工作。
已有平台介绍-Lucene • Lucene: • 用Java开发的文档索引和检索系统 • 针对Web应用的,提供了简单的编程接口,但是功能强大 • 支持增量索引、多字段索引,支持各种文档格式(html,pdf,word,mp3等),也提供了丰富的查询功能; • 支持多语言,也可以编写解析器(Analyzer)扩展支持其他语言 • 应用广泛,chinabbs,苹果的iTunes,微软的Outlook搜索插件等就是用Lucene架构的 • Lucene的其他版本: • C++版(CLucene,非官方开发,代码可读性不是很好) • C#版(Lucene.net,非官方开发) • C版(Lucene4C,官方开发,还没有正式发布代码)
已有平台介绍-Lucene(续) • 缺陷: • 性能较差,不能满足性能要求较高的应用 • Lucene是由Java语言实现的,Java的解析执行方式限制了Lucene的性能 • 为了通用性和简化实现复杂度,Lucene把所有的索引字段都作为字符串来处理,采用共享前缀存储,虽然采用了一些技巧来加快搜索速度,但是这种存储方式在根本上决定了Lucene的性能不可能做得很高,处理的数据规模也不可能很大 • Lucene的部分索引算法、索引合并算法和检索算法不够高效 • Lucene主要面向实际应用,在研究领域,要使用Lucene做实验还是比较困难和麻烦的 • 对于中文支持不是很好,目前官方只提供了简单的单字切分的分析器。
已有平台介绍-Nutch • Nutch • Java开发,是Lucene Project的一个子项目,一个完整的搜索引擎,包括web采集,web内容分析,链接分析,分布式文件系统(NDFS),索引和检索(采用Lucene) • 可扩展,基于插件式架构: • URL Normalizers and Filters 插件 • 网络协议插件(HTTP,FTP等) • 分析器插件 • 索引和查询插件 • NDFS(Nutch Distributed File System) • 基于Google File System • 采用Google提出的MapReduce
已有平台介绍- Hyper Estraier 等 • Hyper Estraier :支持P2P架构,开放式API,C开发,Linux/Windows平台 • Swish-e:快速,灵活的开源搜索引擎,支持多种文件格式的索引. C开发,windows/linux • SWISH++ :基于Swish-e 的文件索引和搜索引擎,C开发,Unix平台 • Zebra:结构化文本索引和检索系统,C开发,windows/Linux平台 • ht://Dig :完备的索引和搜索系统,针对domain和intranet,C++开发,Unix,Linux平台 • WIRE -包含采集器,全文索引和检索,索引部分集成Swish-e • YACY:基于P2P的分布式Web 索引(Java)
Pluggable Extensible Build-in interface implementation FirteX架构 Application Collection Parser Analyzer Index Access Component Index Searcher Index Reader Index Writer Index Component Word Indexer URL Indexer Other User Indexer Storage Component Disk Storage RAM Storage Cluster Storage
…. Application Layer Forum Search Engine Digital Library Experiment MP3 Parser Email Parser AVI Parser … …. Parser Layer Analyzer Layer HTML Parser PDF Parser WORD Parser PPT Parser XML Parser Chinese Analyzer Japanese Analyzer Korean Analyzer …. English Analyzer … … Indexer/Searcher Indexer MemCache Searcher Email Indexer Email Searcher Term Indexer Term Searcher Inverted Index Files barrel barrel barrel barrel barrel barrel barrel barrel barrel barrel barrel barrel Storage Layer
FirteX索引流程 Web Collection Dir Collection Distribute Collection …. Parser Aggregator (Pluggable) … HTML PDF WORD HTML Parser PDF Parser WORD Parser …. Analyzer (Pluggable) Indexer Aggregator (Pluggable) Chinese, English word Any other data type URL Name Entity Word Indexer Name Entity Indexer URL Indexer …. Index Repository
索引组件(Index Component) • 增量索引算法FXII(FirteX Incremental Indexing Algorithm) • 类哈夫曼索引合并算法(Huffman-like Index Merge) • 包含一个或多个字段索引组件(Field Index Component) • 字段索引组件实现具体字段(例如正文字段,URL字段,日期字段等)的索引建立、合并和检索功能,包含三个主要组成部分:字段索引器、字段索引合并器和字段索引检索器,分别对应上述三个功能 • 该组件是可扩展的,FXII算法和HIM算法独立于具体的字段索引组件,用户实现的字段索引组件不用做额外的工作就可以具备快速索引和增量索引的特性。 • 目前实现的字段索引组件包括Word Index Component(中、英文正文字段)、Date Index Component(日期字段)和URL Index Component(URL字段)
差量编码,变长压缩 FXII增量索引算法 内存中 12 5 21 4 32 8 10 2 ….. lexicon Posting Lists <1,2><3,3>…. <4,2><5,4><7,1>…. <2,4><2,4,6>… <1,3><2,4,6,4>… <1,2><3,3>…. <4,2><5,4><7,1>…. <2,4><2,4,6>… <1,3><2,4,6,4>… index barrels <1,2><3,3>…. <4,2><5,4><7,1>…. <2,4><2,4,6>… <1,3><2,4,6,4>… barrel barrel barrel <1,2><3,3>…. <4,2><5,4><7,1>…. barrel <2,4><2,4,6>… <1,3><2,4,6,4>… 内存不足,写至磁盘,清空内存缓冲
mergeFactor=3 HIM索引合并算法 [32,33) [31,32) [30,31) 1 2 3 4 5 6 7 8 9 10 2(1-2) 5(3-7) 1(8) 3(9-11) 2(12-13) 2(14-15) 8(16-23) 6(24-29) 9(30-38) 11(39-49)
9(30-38) 11(39-49) 9(30-38) 11(39-49) 9(28-38) 11(39-49) 9(28-38) 11(39-49) 3(8-10) 5(11-15) 3(9-11) 8(16-23) 6(24-29) 5(3-7) 8(16-23) 6(24-29) 3(8-10) 5(11-15) 8(36-43) 6(44-49) 3(8-10) 5(11-15) 8(16-23) 6(24-29) 2(6-7) 2(14-15) 2(34-35) 2(14-15) FXII增量索引算法(续) 13 mergeFactor=3 33(1-33) 9 10 12 [32,33) 13(1-13) barrels 4 2 7 8 11 [31,32) 5(1-5) 3 1 5 6 [30,31) 1(8) 2(1-2) 2(12-13)
索引存储组件(Storage Component) • 索引压缩 • 采用整数变长编码压缩(也叫RVL压缩编码) • Posting-list的一般形式是:<d; f; <o1,o2,…of>>df • d, o差量编码后压缩,f直接压缩 • 优点:压缩和解压缩速度非常快,而且支持局部解压缩 ;缺点:压缩率不太高,压缩后的索引大小一般是原始文档的50%左右 • Lucene和Lemur均采用此压缩方式 • 索引存储 • 相当于FirteX的虚拟文件系统,具有数据存储、读取和修改等接口,而具体的数据存储方式,存储位置,和压缩算法对于上层的索引组件来说是透明的; • 用户可以针对特定的应用需求,使用或设计特定的存储部件 • 目前实现的存储组件有磁盘存储组件,内存存储组件和内存映射存储组件 • 此部分设计与实现与Lucene基本相同,Lemur不具备此功能
索引访问组件(Index Access Component) • 索引检索(Index Search) • FirteX的检索系统,目前支持的检索类型有句子检索,布尔检索和时间日期检索等,可分字段检索 • 索引生成(Index Writer) • 是一个连接部件,将应用层的Analyzer组件的分析结果输入到索引组件,由各个字段索引器进行索引,此外,也提供了索引添加、合并、删除等访问接口 • 索引读取(Index Reader) • 是一个代理组件,仅仅封装索引组件的只读访问接口,不提供任何写和修改的接口,以防用户的误操作破坏索引数据
FirteX的检索架构 查询q Query Parser Analyzer Query postings Term Reader Index Searcher Similarity (Pluggable) idf tf Weight (Extensible) Scorer (Extensible) Index Repository filter, sort Filter (Pluggable) Query Hits Sorter (Pluggable)
FirteX的检索架构(续) • FirteX的检索架构类似于Lucene的检索架构,不同点在于词汇表检索算法和Scorer的核心算法(跳跃式有序向量相交算法和posting-list检索算法等) • Scorer、Similarity、Weight、Filter和Sorter部件都是用户可扩展的,用于控制检索系统的检索结果排序 • Scorer、Similarity和Weight三个部件组合,可以实现目前绝大部分检索模型,便利检索效率和检索模型实验。
Posting-list 合并 • 如果是句子查询,则需要进行两个操作:文档合并和位置合并 • 两个操作本质都是有序序列的相交,位置合并可转换为有序序列合并操作 • 我们采用的是跳跃式有序向量相交算法 • 该算法首先取第一个有序序列的第一个元素e,在第二个有序序列中采用二分查找算法搜索e,如果找到则取下一个序列继续搜索,否则取查找过程中发现的大于e但大小最接近e的元素e2继续在下一序列中搜索,直到所有序列搜索完毕 • 优点:由于序列是差量编码并采用整数变长压缩的,如果一次性解压缩再进行合并,占用内存大而且可能做一些无用的解压缩操作 • 例如,假设序列L1有10个元素,L2有1000个元素,有可能L2只需要解压缩前面几个元素即可判断和L1有无相同元素,省去后面的大部分元素解压时间和空间消耗
FirteX 的功能对比 NOTE:表中有关Lucene和Lemur的所有数据都是从相应系统的官方网站获取的.
FirteX 性能测试-索引 测试环境: Windows 2000 Advance Server,P4 2.8G(2CPU),2G RAM,共5个纯文本数据集,从北大天网CWT100G中文网页语料中提取,文件大小5k~30k
FirteX 性能测试-检索 注:检索是在索引优化合并后进行,仅检索词典收录词
使用示例-Indexing 1 CParser* pParser = new CPlainParser(); 2 CAnalyzer* pAnalyzer = new CChineseAnalyzer(pParser); 3 CIndexWriter* pWriter = new CIndexWriter("indexname",pAnalyzer); 4 CCollection* pDir = new CDirCollection(“docPath",pWriter); 5 pDir->scan();//扫描文档集,建立倒排索引 6 delete pDir;
使用示例-Searching 1 CQuery* pQuery = CQueryParser::Parse(“FirteX AND i3s”,“content”,new CChineseAnalyzer); 2 CSearch* pSearch = new CIndexSearch(“indexname”); 3 CQueryHits *pHits = pSearch->search(pQuery); 4 pHits->startIterator(); 5 while(pHits->hasNext()) 6 CDocument* pDoc = pHits->doc(); 7 //使用 pDoc 8 delete pQuery; 9 delete pSearch; 10 delete pHits; 11 delete pDoc;
结论和进一步工作 • FirteX是目前为止我们已了解到的开源系统中速度最快的,支持中文最好的开源的全文索引和检索平台 • 在检索功能上,FirteX还是要比Lucene和Lemur差一些,我们会继续丰富FirteX的这方面功能。 • 加入查询Cache和查询日志记录功能也在计划之内 • 在性能方面,我们将使用更大的数据集进行实验,改进或寻找更加高效的中文索引和检索算法。 • FirteX正在测试和完善中,计划在8月份左右正式发布并提供免费下载。
参考文献 [1] Gerard Salton and Michael J. McGill.Introduction to Modern Information Retrieval. McGraw-Hill, New York, 1983. [2] Christos Faloutsos. Access methods for text. ACM Computing Surveys, 17:50–74, 1985. [3] Donna Harman, Edward Fox, Ricardo Baeza-Yates, and Whay Lee. Inverted files. In William B. Frakes and Ricardo Baeza-Yates, editors, Information Retrieval: Data Structures & Algorithms, chapter 3, pages 28–43. Prentice Hall, Englewood Cliffs, NJ, 1992. [4] The Lemur Toolkit for Language Modeling and Information Retrieval. http://www.lemurproject.org [5] http://lucene.apache.org/ [6] Super dreadnought Estraier: Fight for the Future. http://hyperestraier.sourceforge.net/ [7] http://www.indexdata.dk/zebra/ [8] http://www.htdig.org/ [9] Simple Web Indexing System for Humans–Enhanced. http://swish-e.org/index.html [10] WIRE - Web Information Retrieval Environment. http ://www.cwr.cl/projects/WIRE/index.html YaCy [11] YACY - DISTRIBUTED P2P-BASED WEB INDEXING. http://www.yacy.net/yacy/ [12] http://homepage.mac.com/pauljlucas/software/swish/ [13] BROWN, E. W., CALLAN, J. P., AND CROFT, W. B. 1994. Fast incremental indexing for full-text information retrieval. In Proceedings of the 20st International Conference on Very Large Databases (September), 192–202. [14] R. Baesa-Yates and B. Ribeiro-Neto. Modern Information Retrieval. Addison Wesley, Reading, Mass. 1999. [15] L. Lim, M. Wang, S. Padmanabhan, J. S. Vitter, and R. Agarwal. Dynamic maintenance of web indexes using landmarks. In Proceedings of the 12th International World Wide Web Conference, pages 102{111, May 2003. [16] I. Witten, A. Mo_at, and T. Bell. Managing Gigabytes. Morgan Kaufmann Publishers, New York, second edition, 1999. [17] F. Scholer, H. E. Williams, J. Yiannis, and J. Zobel. Compression of inverted indexes for fast query evaluation. Presented at proceedings of the Twenty-Fifth Annual International ACM SIGIR Conference on Research and Development in Information Retrieval, Aug 11-15 2002,Tampere, Finland, 2002. [18] ZobelJ, MoffatA. Adding compression to a full-text retrieval system.. Software Practice and Experience,25(8):891–903,1995 [19] Williams HE, Zobel J. Compressing integers for fast file access. The Computer Journal,42(3):193–201,1999 [20] S. Melnik, S. Raghavan, B. Yang, and H. Garcia-Molina. Building a Distributed Full-Text Index for the Web. In Proceedings of the 10th International World Wide Web Conference, Hong Kong, pages 396–406, 2001.