LAMP 人主题分享交流会 LAMPER.CN
Coreseek/Sphinx 全文检索实践指南 <ul><li>李沫南 </li></ul><ul><li>2011-05-03 </li></ul>
涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></u...
全文检索可以解决的业务系统问题 <ul><li>列表展示 </li></ul><ul><li>内容检索 </li></ul><ul><li>相关内容推荐 </li></ul><ul><li>统计分析 </li></ul>
全文检索  VS  数据库检索 <ul><li>SELECT * FROM  documents WHERE title like '%test%' </li></ul><ul><ul><li>CPU 100% </li></ul></ul><...
数据库的全文索引 <ul><li>全文索引字段,数据库的标配功能 </li></ul><ul><ul><li>MySQL / PostgreqSQL </li></ul></ul><ul><ul><li>SQL Server / Oracle ...
涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></u...
No Magic  - 倒排索引 <ul><li>比普通数据库检索快几倍 ~ 几百倍的性能提升 </li></ul><ul><li>预读取、预切分 </li></ul><ul><li>想想新华字典 </li></ul><ul><li>倒排索引(...
全文检索技术的宗教传统 <ul><li>线上的查经工具 </li></ul><ul><ul><li>http://abibletool.net/search.aspx </li></ul></ul><ul><ul><li>哥林多前书  13:8...
倒排索引历史 <ul><li>主后 1230 年,根据拉丁文  圣经  编制 </li></ul><ul><ul><li>主持者  Hugo de Sancto Charo  雨果 </li></ul></ul><ul><ul><li>参与着 ...
圣经倒排索引的假设 <ul><li>所有词语具有一样的重要性 </li></ul><ul><li>不考虑词语出现的先后顺序 </li></ul><ul><li>分章、分节 </li></ul><ul><li>不考虑排序(按照出现的先后顺序排序)...
涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></u...
全文检索的最简化模型 <ul><li>Word Of Bag </li></ul><ul><ul><li>把文档作为一个口袋 </li></ul></ul><ul><ul><li>Term 是口袋中的元素 </li></ul></ul><ul>...
全文检索 向量空间模型 <ul><li>把文档视为一个向量 </li></ul><ul><ul><li>Document Vector = {term1, term2, … termN} </li></ul></ul><ul><ul><li>Q...
向量空间模型的优缺点 <ul><li>优点 </li></ul><ul><ul><li>考虑到了 Term 出现的频率 </li></ul></ul><ul><ul><li>相对更好的相关度排序 </li></ul></ul><ul><li>缺...
全文检索 概率模型 <ul><li>文档集合分为两部分 </li></ul><ul><ul><li>相关文档 </li></ul></ul><ul><ul><li>不相关文档 </li></ul></ul><ul><ul><li>每个查询词贡献...
LSI 检索 <ul><li>隐含语义索引 LSI (Latent Semantic Index)  </li></ul><ul><ul><li>1988 年由 S.T. Dumais 等人提出,主要用于自然语言理解,通过统计的方法对文档的进行...
涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></u...
开源检索系统的对比分析 <ul><li>开源传万世,因有我参与 </li></ul><ul><li>常见开源的全文检索系统一览 </li></ul><ul><ul><li>Lucene / Nutch / Solr APL </li></ul>...
如何评价检索系统? <ul><li>检索精度( F-Score) </li></ul><ul><ul><li>查全率、查准率(相关度) </li></ul></ul><ul><li>可以处理的数据规模、系统架构 </li></ul><ul><l...
检索系统特性一览 特性 Lucene Sphinx (Coreseek) Xapian Lemur 开发语言 Java C/C++ C/C++ C/C++ 索引存储结构 专用格式 专用格式 B+  树 B+  树 正向、反向索引 支持 仅反向 ...
涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></u...
Why I choose Sphinx <ul><li>Terabyte Index </li></ul><ul><li>良好的文档支持 </li></ul><ul><li>与 LAMP 软件栈紧密集成 </li></ul><ul><li>唯一...
Sphinx (Coreseek) 特性介绍( 1 ) <ul><li>high indexing and searching performance; </li></ul><ul><li>advanced indexing and query...
Sphinx(Coreseek)  特性介绍( 2 ) <ul><li>easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE s...
Coreseek(Sphinx) VS Lucene <ul><li>Coreseek  ( Sphinx ) </li></ul><ul><ul><li>开箱即用的产品 ( LAMP ) </li></ul></ul><ul><ul><li>...
Sphinx VS Lucene <ul><li>Faster Indexing </li></ul><ul><li>Faster, more relevant searching </li></ul><ul><li>SQL style que...
Sphinx  优势 <ul><li>BM25 Ranker </li></ul><ul><li>phrase base ranking </li></ul><ul><li>Boosts (sub) phrase matches </li></...
Sphinx  限制 <ul><li>~ =  20 G  ,  Per-single Index </li></ul><ul><li>CRC64 WordID </li></ul><ul><li>Field Mask, Only 24 Fie...
吹牛时间(酒精考验的 Sphinx ) <ul><li>Boardreader.com </li></ul><ul><ul><li>3KW  文档,  1M+ query/day  </li></ul></ul><ul><li>craigsli...
Q&A
Upcoming SlideShare
Loading in …5
×

Sphinx 全文检索实践指南

3,139 views

Published on

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

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,139
On SlideShare
0
From Embeds
0
Number of Embeds
842
Actions
Shares
0
Downloads
60
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • Boolean 在 20 世纪 80 年代非常流行,直到现在,很多传统系统仍然在使用 Boolean 模型进行工作。 传统的研究者认为, Boolean 模型可以精确的找到他们想要的内容,而不会丢失信息 现代的研究发现,基于统计的模型往往比人工精心调整的 Boolean 检索式带来更好的结果
  • BM25 公式: score ( D , Q ):就是我们所要计算的评分,即为 [ 给定搜索内容 ]Q 在 [ 给定文档 ]D 中的相关程度,分数越高表示相关度越高。 q : [ 给定搜索内容 ]Q 中的语素,英文的话就是单词,中文的话需要先进行简单的切词操作。 f ( qi,D ):在 [ 给定文档 ]D 中,某一个语素 qi 出现的频率。 |D| : [ 给定文档 ]D 长度。 avgdl: 索引中所有文档长度。 另外两个参数 K1 和 b 用来调整精准度,一般情况下我们取 K1=2 , b=0.75 。 IDF 公式:是用来计算公式 1 中 IDF ( qi )的值 N :索引中文档的总数目。 n ( qi ):索引中包含语素 qi 的文档的总书目。
  • http://ccl.pku.edu.cn/doubtfire/NLP/Artificial_Intelligence/Latent%20Semantic%20Indexing.txt
  • Sphinx 全文检索实践指南

    1. 1. LAMP 人主题分享交流会 LAMPER.CN
    2. 2. Coreseek/Sphinx 全文检索实践指南 <ul><li>李沫南 </li></ul><ul><li>2011-05-03 </li></ul>
    3. 3. 涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></ul><ul><li>基于 Sphinx 的全文检索系统规划 </li></ul>
    4. 4. 全文检索可以解决的业务系统问题 <ul><li>列表展示 </li></ul><ul><li>内容检索 </li></ul><ul><li>相关内容推荐 </li></ul><ul><li>统计分析 </li></ul>
    5. 5. 全文检索 VS 数据库检索 <ul><li>SELECT * FROM documents WHERE title like '%test%' </li></ul><ul><ul><li>CPU 100% </li></ul></ul><ul><ul><li>'30 秒内只能进行一次查询 ' </li></ul></ul><ul><ul><li>没有找到记录 ... </li></ul></ul><ul><li>如何解决? </li></ul><ul><ul><li>为了提升数据库的性能,在某些字段上建索引 </li></ul></ul><ul><ul><li>答案:在全文字段上加索引 </li></ul></ul>
    6. 6. 数据库的全文索引 <ul><li>全文索引字段,数据库的标配功能 </li></ul><ul><ul><li>MySQL / PostgreqSQL </li></ul></ul><ul><ul><li>SQL Server / Oracle </li></ul></ul><ul><li>问题: </li></ul><ul><ul><li>影响记录的存取性能 </li></ul></ul><ul><ul><li>非标准的检索语法 </li></ul></ul><ul><ul><li>切分规则? </li></ul></ul><ul><ul><li>排序规则? </li></ul></ul><ul><ul><li>Too slow while indexing real-world dataset </li></ul></ul>
    7. 7. 涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></ul><ul><li>基于 Sphinx 的全文检索系统规划 </li></ul>
    8. 8. No Magic - 倒排索引 <ul><li>比普通数据库检索快几倍 ~ 几百倍的性能提升 </li></ul><ul><li>预读取、预切分 </li></ul><ul><li>想想新华字典 </li></ul><ul><li>倒排索引(反向索引) </li></ul><ul><ul><li>Term1 -> Doc1(pos1, pos2, pos...), Doc2, Doc3 … </li></ul></ul><ul><li>正向索引 </li></ul><ul><ul><li>Doc1 -> Term1(pos1, pos2, pos ...) </li></ul></ul>
    9. 9. 全文检索技术的宗教传统 <ul><li>线上的查经工具 </li></ul><ul><ul><li>http://abibletool.net/search.aspx </li></ul></ul><ul><ul><li>哥林多前书 13:8 &quot; 爱是恒久忍耐、又有恩慈.爱是不嫉妒.爱是不自夸.不张狂. &quot; </li></ul></ul>
    10. 10. 倒排索引历史 <ul><li>主后 1230 年,根据拉丁文 圣经 编制 </li></ul><ul><ul><li>主持者 Hugo de Sancto Charo 雨果 </li></ul></ul><ul><ul><li>参与着 500 多人 </li></ul></ul><ul><li>主后 1550 年,第一部英文的词索引 </li></ul><ul><ul><li>编者 John Marbeck </li></ul></ul><ul><li>计算机出现后,计算机辅助编制索引 </li></ul><ul><ul><li>70~80 年代, MAT 程序族 </li></ul></ul>
    11. 11. 圣经倒排索引的假设 <ul><li>所有词语具有一样的重要性 </li></ul><ul><li>不考虑词语出现的先后顺序 </li></ul><ul><li>分章、分节 </li></ul><ul><li>不考虑排序(按照出现的先后顺序排序) </li></ul>
    12. 12. 涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></ul><ul><li>基于 Sphinx 的全文检索系统规划 </li></ul><ul><li>SEO & SEM 全文检索引擎的视角 </li></ul>
    13. 13. 全文检索的最简化模型 <ul><li>Word Of Bag </li></ul><ul><ul><li>把文档作为一个口袋 </li></ul></ul><ul><ul><li>Term 是口袋中的元素 </li></ul></ul><ul><ul><li>[ 假设 ] 元素之间 </li></ul></ul><ul><ul><ul><li>地位平等 </li></ul></ul></ul><ul><ul><ul><li>顺序无关 </li></ul></ul></ul><ul><ul><ul><li>独立分布 </li></ul></ul></ul><ul><li>Boolean 检索 </li></ul><ul><ul><li>非此即彼的二元世界观 </li></ul></ul><ul><ul><li>a AND b , a OR b, a NOT b </li></ul></ul>
    14. 14. 全文检索 向量空间模型 <ul><li>把文档视为一个向量 </li></ul><ul><ul><li>Document Vector = {term1, term2, … termN} </li></ul></ul><ul><ul><li>Query Vector = {term1, term2 } </li></ul></ul><ul><li>TF/ IDF 算法 </li></ul><ul><ul><li>Okapi BM25 (BM = Best Match) </li></ul></ul><ul><ul><li>Phrase Ranking </li></ul></ul><ul><li>Rocchio 相关度反馈算法 </li></ul>
    15. 15. 向量空间模型的优缺点 <ul><li>优点 </li></ul><ul><ul><li>考虑到了 Term 出现的频率 </li></ul></ul><ul><ul><li>相对更好的相关度排序 </li></ul></ul><ul><li>缺点 </li></ul><ul><ul><li>不适合处理超长文件 </li></ul></ul><ul><ul><ul><li>或者同一集合上,文件长度的尺寸差距很大 </li></ul></ul></ul><ul><ul><li>检索的 Term 必须完全匹配 </li></ul></ul><ul><ul><li>不考虑语用(同义词、近义词) </li></ul></ul><ul><ul><li>CJK 短语支持 ... </li></ul></ul><ul><li>其他的模型? </li></ul>
    16. 16. 全文检索 概率模型 <ul><li>文档集合分为两部分 </li></ul><ul><ul><li>相关文档 </li></ul></ul><ul><ul><li>不相关文档 </li></ul></ul><ul><ul><li>每个查询词贡献相关度 </li></ul></ul>
    17. 17. LSI 检索 <ul><li>隐含语义索引 LSI (Latent Semantic Index) </li></ul><ul><ul><li>1988 年由 S.T. Dumais 等人提出,主要用于自然语言理解,通过统计的方法对文档的进行语义分析,发掘同义词,相关词组等等 </li></ul></ul><ul><ul><li>直接匹配关键词的问题 </li></ul></ul><ul><ul><li>同一个概念可以用多个词表达 </li></ul></ul><ul><ul><li>将查询视为一篇文档,并对其进行奇异值分解 </li></ul></ul><ul><li>算法原理: </li></ul><ul><ul><li>(terms) x (documents) = (matrix) </li></ul></ul><ul><ul><li>X 分解为三个矩阵 T0, S0, D0'(D0 的转置 ) 的积 </li></ul></ul><ul><ul><li>降维 </li></ul></ul>
    18. 18. 涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></ul><ul><li>基于 Sphinx 的全文检索系统规划 </li></ul>
    19. 19. 开源检索系统的对比分析 <ul><li>开源传万世,因有我参与 </li></ul><ul><li>常见开源的全文检索系统一览 </li></ul><ul><ul><li>Lucene / Nutch / Solr APL </li></ul></ul><ul><ul><li>Sphinx / Coreseek GPL/ 商业授权 </li></ul></ul><ul><ul><li>Xapian GPL </li></ul></ul><ul><ul><li>Lemur ( 支持 Language Model) BSD </li></ul></ul><ul><li>非主流 </li></ul><ul><ul><li>Zettair Terrier .... </li></ul></ul>
    20. 20. 如何评价检索系统? <ul><li>检索精度( F-Score) </li></ul><ul><ul><li>查全率、查准率(相关度) </li></ul></ul><ul><li>可以处理的数据规模、系统架构 </li></ul><ul><li>使用的检索模型(概率|向量空间|语言) </li></ul><ul><li>特性: </li></ul><ul><ul><li>字段检索、自定义排序、属性过滤 </li></ul></ul><ul><ul><li>正向索引?反向索引?分布式支持 </li></ul></ul><ul><ul><li>接口的丰富程度 </li></ul></ul><ul><ul><li>业务的其他需要 </li></ul></ul><ul><li>没有圣杯! </li></ul>
    21. 21. 检索系统特性一览 特性 Lucene Sphinx (Coreseek) Xapian Lemur 开发语言 Java C/C++ C/C++ C/C++ 索引存储结构 专用格式 专用格式 B+ 树 B+ 树 正向、反向索引 支持 仅反向 * 支持 支持 自定义排序 支持,需要改源码 支持 部分支持 支持 字段的支持 支持 支持 * 不支持 支持 TermID 的算法 顺序编号 CRC64* Hash Unknown 分布式支持 Nutch 支持 N/A 支持
    22. 22. 涉及的内容 <ul><li>全文检索可以解决的业务系统问题 </li></ul><ul><li>全文检索的历史回顾 </li></ul><ul><li>全文检索的模型 </li></ul><ul><li>开源的全文检索系统介绍 </li></ul><ul><li>基于 Sphinx 的全文检索系统规划 </li></ul>
    23. 23. Why I choose Sphinx <ul><li>Terabyte Index </li></ul><ul><li>良好的文档支持 </li></ul><ul><li>与 LAMP 软件栈紧密集成 </li></ul><ul><li>唯一可选的 C/C++ 检索系统( @2006 ) </li></ul><ul><li>Lucene 不适用于复杂检索( @2006 ) </li></ul><ul><li>I hate Java </li></ul>
    24. 24. Sphinx (Coreseek) 特性介绍( 1 ) <ul><li>high indexing and searching performance; </li></ul><ul><li>advanced indexing and querying tools (flexible and feature-rich text tokenizer, querying language, several different ranking modes, etc); </li></ul><ul><li>advanced result set post-processing (SELECT with expressions, WHERE, ORDER BY, GROUP BY etc over text search results); </li></ul><ul><li>proven scalability up to billions of documents, terabytes of data, and thousands of queries per second; </li></ul>
    25. 25. Sphinx(Coreseek) 特性介绍( 2 ) <ul><li>easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE search interfaces; </li></ul><ul><li>easy scaling with distributed searches. </li></ul><ul><li>Python data source adapter layer </li></ul><ul><li>Build-in Chinese Tokenizer </li></ul>
    26. 26. Coreseek(Sphinx) VS Lucene <ul><li>Coreseek ( Sphinx ) </li></ul><ul><ul><li>开箱即用的产品 ( LAMP ) </li></ul></ul><ul><ul><li>支持各种数据来源( via Python Source ) </li></ul></ul><ul><ul><li>内置中文分词( ... ) </li></ul></ul><ul><ul><li>商业支持 </li></ul></ul><ul><li>Lucene </li></ul><ul><ul><li>Java 人力成本低 </li></ul></ul><ul><ul><li>库结构设计,修改容易 </li></ul></ul><ul><ul><li>第三方工具? </li></ul></ul><ul><ul><li>分布式? </li></ul></ul>
    27. 27. Sphinx VS Lucene <ul><li>Faster Indexing </li></ul><ul><li>Faster, more relevant searching </li></ul><ul><li>SQL style queries </li></ul><ul><li>We can do Java, but don`t require a Java stack. </li></ul><ul><li>RT-Index VS. In memory Index </li></ul>
    28. 28. Sphinx 优势 <ul><li>BM25 Ranker </li></ul><ul><li>phrase base ranking </li></ul><ul><li>Boosts (sub) phrase matches </li></ul><ul><li>Perfect match is guaranteed to be ranked #1 </li></ul><ul><li>内置 Grouping 、分布式支持 </li></ul>
    29. 29. Sphinx 限制 <ul><li>~ = 20 G , Per-single Index </li></ul><ul><li>CRC64 WordID </li></ul><ul><li>Field Mask, Only 24 Field Supported </li></ul><ul><li>All attributes in memory! </li></ul><ul><li>Poor windows support </li></ul><ul><li>No inner cache support </li></ul><ul><li>Hard to handle more than 3T data </li></ul>
    30. 30. 吹牛时间(酒精考验的 Sphinx ) <ul><li>Boardreader.com </li></ul><ul><ul><li>3KW 文档, 1M+ query/day </li></ul></ul><ul><li>craigslist.com </li></ul><ul><ul><li>20~30GB docs, 50M+ query/day </li></ul></ul><ul><li>国内的实施 </li></ul><ul><ul><li>ChinaUnix Blogbus 51CTO 金融街 BBS .... </li></ul></ul><ul><ul><li>Many site I never seen , due to Open Source ;-) </li></ul></ul><ul><ul><li>某档案馆检索( Tb ) </li></ul></ul>
    31. 31. Q&A

    ×