220 likes | 647 Views
基于 firtex2 搭建分布式搜索引擎. 郭瑞杰. 什么是 firtex2 ?. 高性能、功能丰富、跨平台的开源搜索系统 发展历程: 始于 2005 年 ( firtex ) 2009 年全部重构 (firtex2) 2012 年易用性 / 功能大幅提高 ( 最新版本: 0.5). 为什么选择 firtex2. 高性能 : (TREC 10g 160 万英文文档测试 ) 文档 索引: 6220 docs/ sec (sphinx: 1735 docs/ sec, 3+ )
E N D
什么是firtex2? • 高性能、功能丰富、跨平台的开源搜索系统 • 发展历程: • 始于2005年(firtex) • 2009年全部重构(firtex2) • 2012年易用性/功能大幅提高 (最新版本:0.5)
为什么选择firtex2 • 高性能: (TREC 10g 160万英文文档测试) • 文档索引:6220 docs/sec (sphinx: 1735 docs/sec, 3+) • 查询:latency: 10~100 ms/query (sphinx: 2+) • 功能丰富: • 支持UTF-8/GBK中、英文,多字段、多属性文本 • 布尔、短语和近义词查询,带表达式的多重排序和过滤 • 中文语义分词、单字分词 • 灵活易用 • Xml灵活配置 • 提供php、pythonapi • 跨平台 (C++实现): • Windows/Ubuntu/Red hat/Mac OS • 开源(LGPL): 商业友好,免费使用 • http://souceforge.net/projects/firtex • 用户手册:http://firtex.sourceforge.net
如何快速上手-单机版 小规模数据:单机 Frontend firtex2 搜索服务 数据库 索引 结构化文档 构建索引 ……
Step1. 准备数据 数据格式一:firtex2文档 数据库 DOC=ADD^[ TITLE=车库咖啡^^ CONTENT=开源技术小组技术交流^^ DATE=2012-07-29 15:00:00^^ ^] DOC=ADD^[ … ^] 数据导出工具 结构化文档 数据格式二:XML文档 <DOC> <URL>http://weibo.com/ruijieguo</URL> <TITLE>车库咖啡</TITLE> <CONTENT>开源技术小组</CONTENT> <DATE>2012-07-29 15:00:00</DATE> </DOC> <DOC> ... </DOC> ……
Step2. 构建索引-配置 fbuilder.xml: <?xml version="1.0" encoding="UTF-8"?> <configure> <global> … </global> <collection> … </collection> <index_schema> <fields> <field> <name>TITLE</name> <type>UTF8_TEXT</type> </field> … </fields> </index_schema> </configure> 全局配置,例如词典路径、合并策略、内存控制 数据源配置,类型、路径,性能相关参数 定义文档结构: 有什么字段,字段类型和索引方式 详细配置请参考《用户使用手册》
Step2. 构建索引-运行 Ubuntu/Red Hat/Mac OS等: $ svnco https://firtex.svn.sourceforge.net/svnroot/firtex/firtex2/trunk firtex2 $ cd firtex2 $ ./bootstrap & make & make install $ ./fbuilder -c fbuilder.xml Windows下: Visual studio 2005/2008/2010
Step3. 搜索服务-配置 fsearchd.xml <?xml version="1.0" encoding="UTF-8"?> <configure> <global> … </global> <searchd> <server> <host>localhost:19801</host> <thread_pool>10</thread_pool> <logger_conf>./logger_conf.xml</logger_conf> </server> <resource> <index_data>../examples/data/plain_utf8_index</index_data> <default_field>BODY</default_field> <refresh_timer>0</refresh_timer> </resource> </searchd> </configure> 全局配置,例如词典路径、合并策略、内存控制 定义服务监听端口,线程池和logger配置路径 索引数据路径,数据刷新频度
Step3. 搜索服务-运行 $ ./fsearchd -c conf/fsearchd.xml -t http $ wget http://localhost:19801/search?query=BODY:车库咖啡 HTTP 服务: RPC 服务: $ ./fsearchd -c conf/fsearchd.xml -t rpc $ ./frpcclient -s localhost -p 19801 -q query=BODY:车库咖啡
查询结果示例 <?xml version="1.0"?> <result> <hits number_hits=”2" total_hits="24174" cost="15"> <hit> <docid>791822</docid> <score>15.70</score> <fields> <DOCID> <![CDATA[WTX034-B38-352]]> </DOCID> <URL> <![CDATA[http://musicweb.austin.tx.us:80/Archives/96Feb.html]]> </URL> </fields> </hit> <hit> … </hit> </hits> </result>
如何快速上手-机群版 大规模数据:机群 Blender Proxy Proxy Cluster1 Cluster2 Searcher Searcher Replica … … … … … … Shard Shard Build & Copy 数据源(HDFS) …
fproxy.xml proxy服务-配置 <?xml version="1.0" encoding="UTF-8"?> <configure> <proxy> <server> … </server> <resource> <load_ballance>round_robin</load_ballance> <shards> <shard> <name>shard1</name> <replicas> … </replicas> </shard> … </shards> </resource> </proxy> </configure> replica间的负载均衡策略 Shards/replicas列表 详细配置请参考《用户使用手册》
Proxy服务-运行 $ ./fproxy -c conf/fsearchd.xml -t http -r proxy $ wget http://localhost:19803/search?query=BODY:车库咖啡 HTTP 服务: RPC 服务: $ ./fproxy -c conf/fsearchd.xml -t rpc $ ./frpcclient -s localhost -p 19803 -q query=BODY:车库咖啡
其他选择 • Amazon Cloud Search (收费) • 阿里云开放云搜索: http://css.aliyun.com(免费) • Lucene(Java) • IndexTank (基于Lucene,Linkedin) • ElasticSearch (基于Lucene, RESTfull API) • Solr/SolrCloud (基于Lucene) • Sphinx(C++, 支持嵌入mysql) • Xapian (C++)
原理篇—倒排索引 Doc0:海量0/数据1/开源2/解决3/方案4/和5/技术6/方案7/分享8 Doc1:从0/开源1/中2/来3/,4/到5/开源6/中7/去8 0, 1, <0> 0, 1, <0> 0, 1, <0> 0, 1, <2>; 1, 2<1, 6> 0, 1, <3> 0, 1, <7> 0, 1, <5> 0, 1, <6> 0, 1, <8> 1, 1, <0> 1, 2, <2, 7> 1, 1, <3> 1, 1, <5> 1, 1, <8>
倒排索引压缩 0 15 • Firtex2采用New-PForDelta压缩算法 (http://www2008.org/papers/pdf/p387-zhangA.pdf) 0 1 3 32 0 1 3 16 0 1 3 31 0 1 3 0 0 1 3 1 0 1 20 2 0 1 3 1 0 1 3 0 … 0 15 0 1 3 0 0 1 3 0 0 1 3 3 0 1 3 0 0 1 3 1 0 2 0 2 0 1 3 1 0 1 3 0 … 8 7 4 11 7 22 5 Simple 9 压缩 Pack到2bit存储
倒排索引压缩 • 索引压缩率: • Doc-list: 26% • Tf-list:10% • Pos-list:32% • 平均压缩率:26%
其他常用压缩算法 • VInt (Lucene) • Group Vint (google) • Simple 9/Simple 16 • ……
后续计划 • 支持在hadoop上构建大规模数据索引 • 分布式动态调度 • 更多更友好易用的接口—RESTfull API • 毫秒级实时索引 • 监控
Roadmap Query Blender Zookeeper API (RPC/RESTfull) … Proxy Proxy Cluster1 Cluster2 Searcher Searcher Deploy Tools Master Monitor (UI) Real-time Data Feeder Replica Replica Node pool Raw data … … … … … … … Data Gather Shard Shard Dispatch HDFS Build Job …
谢谢!欢迎大家试用、参与http://sourceforge.net/projects/firtex谢谢!欢迎大家试用、参与http://sourceforge.net/projects/firtex 新浪微博:@郭瑞杰_ft2