sphinx 全文检索实践指南

31

Click here to load reader

Upload: shaoning-pan

Post on 25-Jun-2015

2.855 views

Category:

Documents


7 download

DESCRIPTION

LAMP人主题分享交流会 第七期 李沫南的分享

TRANSCRIPT

Page 1: Sphinx 全文检索实践指南

LAMP人主题分享交流会

LAMPER.CN

Page 2: Sphinx 全文检索实践指南

Coreseek/Sphinx全文检索实践指南

李沫南

2011-05-03

Page 3: Sphinx 全文检索实践指南

涉及的内容

全文检索可以解决的业务系统问题 全文检索的历史回顾 全文检索的模型 开源的全文检索系统介绍 基于 Sphinx的全文检索系统规划

Page 4: Sphinx 全文检索实践指南

全文检索可以解决的业务系统问题

列表展示 内容检索 相关内容推荐 统计分析

Page 5: Sphinx 全文检索实践指南

全文检索 VS 数据库检索

SELECT * FROM documents WHERE title like '%test%'

CPU 100% '30秒内只能进行一次查询 ' 没有找到记录 ...

如何解决? 为了提升数据库的性能,在某些字段上建索引 答案:在全文字段上加索引

Page 6: Sphinx 全文检索实践指南

数据库的全文索引

全文索引字段,数据库的标配功能 MySQL / PostgreqSQL SQL Server / Oracle

问题: 影响记录的存取性能 非标准的检索语法 切分规则? 排序规则? Too slow while indexing real-world dataset

Page 7: Sphinx 全文检索实践指南

涉及的内容

全文检索可以解决的业务系统问题 全文检索的历史回顾 全文检索的模型 开源的全文检索系统介绍 基于 Sphinx的全文检索系统规划

Page 8: Sphinx 全文检索实践指南

No Magic - 倒排索引

比普通数据库检索快几倍 ~几百倍的性能提升 预读取、预切分 想想新华字典 倒排索引(反向索引)

Term1 → Doc1(pos1, pos2, pos...), Doc2, Doc3 … 正向索引

Doc1 → Term1(pos1, pos2, pos ...)

Page 9: Sphinx 全文检索实践指南

全文检索技术的宗教传统

线上的查经工具 http://abibletool.net/search.aspx 哥林多前书 13:8 "爱是恒久忍耐、又有恩慈.爱是不嫉妒.爱是不自夸.不张狂. "

Page 10: Sphinx 全文检索实践指南

倒排索引历史

主后 1230 年,根据拉丁文 圣经 编制 主持者 Hugo de Sancto Charo 雨果 参与着 500 多人

主后 1550年,第一部英文的词索引 编者 John Marbeck

计算机出现后,计算机辅助编制索引 70~80年代,MAT程序族

Page 11: Sphinx 全文检索实践指南

圣经倒排索引的假设

所有词语具有一样的重要性 不考虑词语出现的先后顺序 分章、分节 不考虑排序(按照出现的先后顺序排序)

Page 12: Sphinx 全文检索实践指南

涉及的内容

全文检索可以解决的业务系统问题 全文检索的历史回顾 全文检索的模型 开源的全文检索系统介绍 基于 Sphinx的全文检索系统规划 SEO & SEM 全文检索引擎的视角

Page 13: Sphinx 全文检索实践指南

全文检索的最简化模型

Word Of Bag 把文档作为一个口袋 Term是口袋中的元素 [假设 ]元素之间

地位平等 顺序无关 独立分布

Boolean 检索 非此即彼的二元世界观 a AND b, a OR b, a NOT b

Page 14: Sphinx 全文检索实践指南

全文检索 向量空间模型

把文档视为一个向量 Document Vector = {term1, term2, … termN} Query Vector = {term1, term2 }

TF/ IDF 算法 Okapi BM25 (BM = Best Match) Phrase Ranking

Rocchio 相关度反馈算法

Page 15: Sphinx 全文检索实践指南

向量空间模型的优缺点

优点 考虑到了 Term出现的频率 相对更好的相关度排序

缺点 不适合处理超长文件

或者同一集合上,文件长度的尺寸差距很大 检索的 Term必须完全匹配 不考虑语用(同义词、近义词) CJK 短语支持 ...

其他的模型?

Page 16: Sphinx 全文检索实践指南

全文检索 概率模型

文档集合分为两部分 相关文档 不相关文档 每个查询词贡献相关度

Page 17: Sphinx 全文检索实践指南

LSI检索

隐含语义索引 LSI (Latent Semantic Index) 1988年由 S.T. Dumais等人提出,主要用于自然语言理解,通过统计的方法对文档的进行语义分析,发掘同义词,相关词组等等

直接匹配关键词的问题 同一个概念可以用多个词表达 将查询视为一篇文档,并对其进行奇异值分解

算法原理: (terms) x (documents)= (matrix) X分解为三个矩阵 T0, S0, D0'(D0的转置 )的积 降维

Page 18: Sphinx 全文检索实践指南

涉及的内容

全文检索可以解决的业务系统问题 全文检索的历史回顾 全文检索的模型 开源的全文检索系统介绍 基于 Sphinx的全文检索系统规划

Page 19: Sphinx 全文检索实践指南

开源检索系统的对比分析

开源传万世,因有我参与 常见开源的全文检索系统一览

Lucene / Nutch / Solr APL Sphinx / Coreseek GPL/商业授权 Xapian GPL Lemur (支持 Language Model) BSD

非主流 Zettair Terrier ....

Page 20: Sphinx 全文检索实践指南

如何评价检索系统?

检索精度( F-Score) 查全率、查准率(相关度)

可以处理的数据规模、系统架构 使用的检索模型(概率|向量空间|语言) 特性:

字段检索、自定义排序、属性过滤 正向索引?反向索引?分布式支持 接口的丰富程度 业务的其他需要

没有圣杯!

Page 21: Sphinx 全文检索实践指南

检索系统特性一览特性 Lucene Sphinx

(Coreseek)Xapian Lemur

开发语言 Java C/C++ C/C++ C/C++

索引存储结构 专用格式 专用格式 B+ 树 B+ 树

正向、反向索引 支持 仅反向 * 支持 支持

自定义排序 支持,需要改源码

支持 部分支持 支持

字段的支持 支持 支持 * 不支持 支持

TermID的算法 顺序编号 CRC64* Hash Unknown

分布式支持 Nutch 支持 N/A 支持

Page 22: Sphinx 全文检索实践指南

涉及的内容

全文检索可以解决的业务系统问题 全文检索的历史回顾 全文检索的模型 开源的全文检索系统介绍 基于 Sphinx的全文检索系统规划

Page 23: Sphinx 全文检索实践指南

Why I choose Sphinx

Terabyte Index 良好的文档支持 与 LAMP软件栈紧密集成 唯一可选的 C/C++检索系统(@2006) Lucene 不适用于复杂检索(@2006) I hate Java

Page 24: Sphinx 全文检索实践指南

Sphinx (Coreseek)特性介绍( 1)

high indexing and searching performance; advanced indexing and querying tools (flexible

and feature-rich text tokenizer, querying language, several different ranking modes, etc);

advanced result set post-processing (SELECT with expressions, WHERE, ORDER BY, GROUP BY etc over text search results);

proven scalability up to billions of documents, terabytes of data, and thousands of queries per second;

Page 25: Sphinx 全文检索实践指南

Sphinx(Coreseek) 特性介绍( 2)

easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE search interfaces;

easy scaling with distributed searches. Python data source adapter layer Build-in Chinese Tokenizer

Page 26: Sphinx 全文检索实践指南

Coreseek(Sphinx) VS Lucene

Coreseek ( Sphinx) 开箱即用的产品 ( LAMP) 支持各种数据来源( via Python Source) 内置中文分词( ...) 商业支持

Lucene Java 人力成本低 库结构设计,修改容易 第三方工具? 分布式?

Page 27: Sphinx 全文检索实践指南

Sphinx VS Lucene

Faster Indexing Faster, more relevant searching SQL style queries We can do Java, but don`t require a Java stack. RT-Index VS. In memory Index

Page 28: Sphinx 全文检索实践指南

Sphinx 优势

BM25 Ranker phrase base ranking Boosts (sub) phrase matches Perfect match is guaranteed to be ranked #1 内置 Grouping、分布式支持

Page 29: Sphinx 全文检索实践指南

Sphinx 限制

~ = 20 G , Per-single Index CRC64 WordID Field Mask, Only 24 Field Supported All attributes in memory! Poor windows support No inner cache support Hard to handle more than 3T data

Page 30: Sphinx 全文检索实践指南

吹牛时间(酒精考验的 Sphinx)

Boardreader.com 3KW 文档, 1M+ query/day

craigslist.com 20~30GB docs, 50M+ query/day

国内的实施 ChinaUnix Blogbus 51CTO 金融街 BBS .... Many site I never seen, due to Open Source ;-) 某档案馆检索( Tb)

Page 31: Sphinx 全文检索实践指南

Q&A