coresseek-sphinx

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Coreseek/Sphinx全文检索实践指南●李沫南●2010-12-19Whatwillbecovered?AIntroductionofFulltextSearchBriefCompareofOpenSourceFTEnginesWhychooseSphinxWhousingSphinx全文检索VS数据库检索SELECT*FROMdocumentsWHEREtitlelike'%test%'CPU100%'30秒内只能进行一次查询'没有找到记录...如何解决?为了提升数据库的性能,在某些字段上建索引答案:在全文字段上加索引数据库的全文索引全文索引字段,数据库的标配功能MySQL/PostgreqSQLSQLServer/Oracle问题:影响记录的存取性能非标准的检索语法切分规则?排序规则?Tooslowwhileindexingreal-worlddatasetNoMagic-倒排索引比普通数据库检索快几倍~几百倍的性能提升预读取、预切分想想新华字典倒排索引(反向索引)Term1→Doc1(pos1,pos2,pos...),Doc2,Doc3„正向索引Doc1→Term1(pos1,pos2,pos...)全文检索技术的宗教传统线上的查经工具哥林多前书13:8爱是恒久忍耐、又有恩慈.爱是不嫉妒.爱是不自夸.不张狂.倒排索引历史主后1230年,根据拉丁文圣经编制主持者HugodeSanctoCharo雨果参与着500多人主后1550年,第一部英文的词索引编者JohnMarbeck计算机出现后,计算机辅助编制索引70~80年代,MAT程序族圣经倒排索引的假设所有词语具有一样的重要性不考虑词语出现的先后顺序分章、分节不考虑排序(按照出现的先后顺序排序)全文检索的最简化模型WordOfBag把文档作为一个口袋Term是口袋中的元素[假设]元素之间地位平等顺序无关独立分布Boolean检索非此即彼的二元世界观aANDb,aORb,aNOTb全文检索向量空间模型把文档视为一个向量DocumentVector={term1,term2,„termN}QueryVector={term1,term2}全文检索概率模型TF/IDF算法OkapiBM25(BM=BestMatch)PhraseRanking向量空间模型的优缺点优点考虑到了Term出现的频率相对更好的相关度排序缺点不适合处理超长文件或者同一集合上,文件长度的尺寸差距很大检索的Term必须完全匹配不考虑语用(同义词、近义词)CJK短语支持...其他的模型?开源检索系统的对比分析开源传万世,因有我参与常见开源的全文检索系统一览Lucene/Nutch/SolrAPLSphinx/CoreseekGPL/商业授权XapianGPLLemur(支持LanguageModel)BSD非主流ZettairTerrier....如何评价检索系统?检索精度(F-Score)查全率、查准率(相关度)可以处理的数据规模、系统架构使用的检索模型(概率|向量空间|语言)特性:字段检索、自定义排序、属性过滤正向索引?反向索引?分布式支持接口的丰富程度业务的其他需要没有圣杯!WhyIchooseSphinxTerabyteIndex良好的文档支持与LAMP软件栈紧密集成唯一可选的C/C++检索系统(@2006)Lucene不适用于复杂检索(@2006)IhateJavaSphinx(Coreseek)特性介绍(1)高速建立索引;丰富的查询表达式(ANDORNOT句子段落模糊@字段)多种结果后处理机制(GroupBy,OrderBy,CustomWeighting)在生产环境中,千万篇文档,Tb级索引,数千查询/秒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)AShortBreakIndexer的流程1.读取数据•从数据库中读取•用户主动Push(RTIndex)2.Tokenizer•西文(词根、缩写的解读)•CJK(切分)3.建立[倒排]索引•局部倒排•合并CheckTheIndexUseSearchutilitytoqueryaindexincliUseindex_tooltodumpaindex索引文件格式(简介).spi:Dictionary(thecompletelistofwordid’s).spa:Attributes(onlyifdocinfo=extern).spd:Documentlists(foreachkeyword).spp:Hitlists(foreachkeyword).spm:MVAvaluesHowSearchingworksForeachlocalindexBuildalistofcandidates(documentsthatsatisfythefull-textquery)Filter(theanalogyisWHERE)Rank(computethedocuments’relevancevalues)Sort(theanalogyisORDERBY)Group(theanalogyisGROUPBY)MergetheresultsfromallthelocalindexesSQL数据源:处理流程ConnectedtothedatabasePre-query*:initialsetupMainquery:feeddataPost-query:cleanupDisconnectedSorting........Connecttopreformpost-index&disconnectedMMSeg&OtherTokenizer(1)MMSeg的历史从CRFSeg简化而来早期阶段:内置集成现在:外挂,仅处理中文未来:全外挂对配置的增加(index节)charset_dictpathcharset_type:zh_cn.utf-8charset_debugMMSeg&OtherTokenizer(2)字段设置prefix_fieldsprefix_fields=url,domaininfix_fieldsPhrase设置phrase_boundaryphrase_boundary=.,?,!,U+2026phrase_boundary_step构建索引(Indexer)执行indexer--configcsft.conf–allindexer--configcsft.conf{theindexname}indexer--configcsft.conf{theindexname}–rotate定期重建Crontab?TaskKit(Python)Nowwehavetheindex!!Searchd.....推荐的连接方式SphinxAPIPHPPythonRubyPerlSphinxQLMySQL兼容客户端RestfulAPIByCoreseek,indevelopingDemoCode[PHPClientSide]CreateaclientobjectSetuptheoptionsFirethequery?phpinclude(“sphinxapi.php”);$cl=newSphinxClient();$cl-SetMatchMode(SPH_MATCH_PHRASE);$cl-SetSortMode(SPH_SORT_EXTENDED,“pricedesc”);$res=$cl-Query(“ipodnano”,“products”);var_dump($res);?DemoResult[PHPClientSide]MatcheswillalwayshavedocumentID,weightMatchescanalsohavenumericattributes*Nostringattributesyet(pullthemfromMySQL)print_r($result[“matches”][0]):Array([id]=123[weight]=101421[attrs]=Array([group_id]=12345678901[added]=1207261463))DBVs.SphinxWhotakethejob?SQLquerypartsthatcanbemovedtoSphinxFiltering–WHEREvs.SetFilter()orfakekeywordSorting–ORDERBYvs.SetSortMode()Grouping–GROUPBYvs.SetGroupBy()Upto100x(!)improvementvs.“naïve”approachRuleofthumb–moveeverythingyoucanfromMySQLtoSphinxSphinxSearchingpipelineSearch,WHERE,rank,ORDER/GROUP“Cheap”booleansearchingfirstThenfilters(WHEREclause)Then“expensive”relevancerankingThensorting(ORDERBYclause)and/orgrouping(GROUPBYclause)GroupBy(1)SetGroupBySetGroupDistinctGroupBy–SetGroupBy(2)functionSetGroupBy($attribute,$func,$groupsort=@groupdesc)$attribute:readwhichattribute$func:加工$attributeSPH_GROUPBY_[DAY|WEEK|MONTH|YEAR]SPH_GROUPBY_ATTR$groupsort:Sortthegroupingorder.GroupBy–SetGroup

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功