Coreseek/Sphinx全文检索实践指南李沫南2011-05-03LAMP人主题分享交流会LAMPER.CN涉及的内容全文检索可以解决的业务系统问题全文检索的历史回顾全文检索的模型开源的全文检索系统介绍基于Sphinx的全文检索系统规划全文检索可以解决的业务系统问题列表展示内容检索相关内容推荐统计分析全文检索VS数据库检索SELECT*FROMdocumentsWHEREtitlelike'%test%'CPU100%'30秒内只能进行一次查询'没有找到记录...如何解决?为了提升数据库的性能,在某些字段上建索引答案:在全文字段上加索引数据库的全文索引全文索引字段,数据库的标配功能MySQL/PostgreqSQLSQLServer/Oracle问题:影响记录的存取性能非标准的检索语法切分规则?排序规则?Tooslowwhileindexingreal-worlddataset涉及的内容全文检索可以解决的业务系统问题全文检索的历史回顾全文检索的模型开源的全文检索系统介绍基于Sphinx的全文检索系统规划NoMagic-倒排索引比普通数据库检索快几倍~几百倍的性能提升预读取、预切分想想新华字典倒排索引(反向索引)Term1→Doc1(pos1,pos2,pos...),Doc2,Doc3…正向索引Doc1→Term1(pos1,pos2,pos...)全文检索技术的宗教传统线上的查经工具哥林多前书13:8爱是恒久忍耐、又有恩慈.爱是不嫉妒.爱是不自夸.不张狂.倒排索引历史主后1230年,根据拉丁文圣经编制主持者HugodeSanctoCharo雨果参与着500多人主后1550年,第一部英文的词索引编者JohnMarbeck计算机出现后,计算机辅助编制索引70~80年代,MAT程序族圣经倒排索引的假设所有词语具有一样的重要性不考虑词语出现的先后顺序分章、分节不考虑排序(按照出现的先后顺序排序)涉及的内容全文检索可以解决的业务系统问题全文检索的历史回顾全文检索的模型开源的全文检索系统介绍基于Sphinx的全文检索系统规划SEO&SEM全文检索引擎的视角全文检索的最简化模型WordOfBag把文档作为一个口袋Term是口袋中的元素[假设]元素之间地位平等顺序无关独立分布Boolean检索非此即彼的二元世界观aANDb,aORb,aNOTb全文检索向量空间模型把文档视为一个向量DocumentVector={term1,term2,…termN}QueryVector={term1,term2}TF/IDF算法OkapiBM25(BM=BestMatch)PhraseRankingRocchio相关度反馈算法向量空间模型的优缺点优点考虑到了Term出现的频率相对更好的相关度排序缺点不适合处理超长文件或者同一集合上,文件长度的尺寸差距很大检索的Term必须完全匹配不考虑语用(同义词、近义词)CJK短语支持...其他的模型?全文检索概率模型文档集合分为两部分相关文档不相关文档每个查询词贡献相关度LSI检索隐含语义索引LSI(LatentSemanticIndex)1988年由S.T.Dumais等人提出,主要用于自然语言理解,通过统计的方法对文档的进行语义分析,发掘同义词,相关词组等等直接匹配关键词的问题同一个概念可以用多个词表达将查询视为一篇文档,并对其进行奇异值分解算法原理:(terms)x(documents)=(matrix)X分解为三个矩阵T0,S0,D0'(D0的转置)的积降维涉及的内容全文检索可以解决的业务系统问题全文检索的历史回顾全文检索的模型开源的全文检索系统介绍基于Sphinx的全文检索系统规划开源检索系统的对比分析开源传万世,因有我参与常见开源的全文检索系统一览Lucene/Nutch/SolrAPLSphinx/CoreseekGPL/商业授权XapianGPLLemur(支持LanguageModel)BSD非主流ZettairTerrier....如何评价检索系统?检索精度(F-Score)查全率、查准率(相关度)可以处理的数据规模、系统架构使用的检索模型(概率|向量空间|语言)特性:字段检索、自定义排序、属性过滤正向索引?反向索引?分布式支持接口的丰富程度业务的其他需要没有圣杯!检索系统特性一览特性LuceneSphinx(Coreseek)XapianLemur开发语言JavaC/C++C/C++C/C++索引存储结构专用格式专用格式B+树B+树正向、反向索引支持仅反向*支持支持自定义排序支持,需要改源码支持部分支持支持字段的支持支持支持*不支持支持TermID的算法顺序编号CRC64*HashUnknown分布式支持Nutch支持N/A支持涉及的内容全文检索可以解决的业务系统问题全文检索的历史回顾全文检索的模型开源的全文检索系统介绍基于Sphinx的全文检索系统规划WhyIchooseSphinxTerabyteIndex良好的文档支持与LAMP软件栈紧密集成唯一可选的C/C++检索系统(@2006)Lucene不适用于复杂检索(@2006)IhateJavaSphinx(Coreseek)特性介绍(1)highindexingandsearchingperformance;advancedindexingandqueryingtools(flexibleandfeature-richtexttokenizer,queryinglanguage,severaldifferentrankingmodes,etc);advancedresultsetpost-processing(SELECTwithexpressions,WHERE,ORDERBY,GROUPBYetcovertextsearchresults);provenscalabilityuptobillionsofdocuments,terabytesofdata,andthousandsofqueriespersecond;Sphinx(Coreseek)特性介绍(2)easyintegrationwithSQLandXMLdatasources,andSphinxAPI,SphinxQL,orSphinxSEsearchinterfaces;easyscalingwithdistributedsearches.PythondatasourceadapterlayerBuild-inChineseTokenizerCoreseek(Sphinx)VSLuceneCoreseek(Sphinx)开箱即用的产品(LAMP)支持各种数据来源(viaPythonSource)内置中文分词(...)商业支持LuceneJava人力成本低库结构设计,修改容易第三方工具?分布式?SphinxVSLuceneFasterIndexingFaster,morerelevantsearchingSQLstylequeriesWecandoJava,butdon`trequireaJavastack.RT-IndexVS.InmemoryIndexSphinx优势BM25RankerphrasebaserankingBoosts(sub)phrasematchesPerfectmatchisguaranteedtoberanked#1内置Grouping、分布式支持Sphinx限制~=20G,Per-singleIndexCRC64WordIDFieldMask,Only24FieldSupportedAllattributesinmemory!PoorwindowssupportNoinnercachesupportHardtohandlemorethan3Tdata吹牛时间(酒精考验的Sphinx)Boardreader.com3KW文档,1M+query/daycraigslist.com20~30GBdocs,50M+query/day国内的实施ChinaUnixBlogbus51CTO金融街BBS....ManysiteIneverseen,duetoOpenSource;-)某档案馆检索(Tb)Q&A