Coreseek/Sphinx 全文检索实践指南 <ul><li>李沫南 </li></ul><ul><li>2010-12-19 </li></ul>
What will   be covered? <ul><li>A Introduction of Fulltext Search </li></ul><ul><li>Brief Compare of Open Source FT Engine...
全文检索  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 ...
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>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>TF/ IDF  算法 </li></ul><ul><ul><li>Okapi BM25  (BM = Best Match) </li></ul></ul><ul><ul><li>Phrase Rankin...
向量空间模型的优缺点 <ul><li>优点 </li></ul><ul><ul><li>考虑到了 Term 出现的频率 </li></ul></ul><ul><ul><li>相对更好的相关度排序 </li></ul></ul><ul><li>缺...
开源检索系统的对比分析 <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...
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>高速建立索引; </li></ul><ul><li>丰富的查询表达式( AND OR NOT  句子 段落 模糊  @ 字段) </li></ul><ul><li>多种结果...
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...
A Short Break
Indexer  的流程 <ul><li>读取数据 </li></ul><ul><ul><li>从数据库中读取 </li></ul></ul><ul><ul><li>用户主动 Push  ( RTIndex ) </li></ul></ul><...
Check The Index <ul><li>Use Search utility to query a index in cli </li></ul><ul><li>Use index_tool to dump a index </li><...
索引文件格式(简介) <ul><li>.spi: </li></ul><ul><ul><li>Dictionary (the complete list of wordid’s) </li></ul></ul><ul><li>.spa: </l...
How Searching works <ul><li>For each local index </li></ul><ul><li>Build a list of candidates (documents that satisfy the ...
SQL  数据源:处理流程 <ul><li>Connected to the database </li></ul><ul><li>Pre-query* :  initial setup </li></ul><ul><li>Main query...
MMSeg & Other Tokenizer (1) <ul><li>MMSeg  的历史 </li></ul><ul><ul><li>从 CRFSeg  简化而来 </li></ul></ul><ul><ul><li>早期阶段:内置集成 <...
MMSeg & Other Tokenizer (2) <ul><li>字段设置 </li></ul><ul><ul><li>prefix_fields </li></ul></ul><ul><ul><ul><li>prefix_fields ...
构建索引( Indexer ) <ul><li>执行 </li></ul><ul><ul><li>indexer --config csft.conf –all </li></ul></ul><ul><ul><li>indexer --conf...
Searchd ..... <ul><li>推荐的连接方式 </li></ul><ul><ul><li>Sphinx API </li></ul></ul><ul><ul><ul><li>PHP Python Ruby Perl </li></...
Demo Code [PHP Client Side] <ul><li>Create a client object </li></ul><ul><li>Set up the options </li></ul><ul><li>Fire the...
Demo Result [ PHP Client Side] <ul><li>Matches will always have document ID, weight </li></ul><ul><li>Matches can also hav...
DB Vs. Sphinx Who take the job? <ul><li>SQL query parts that can be moved to Sphinx </li></ul><ul><ul><li>Filtering – WHER...
Sphinx Searching pipeline <ul><li>Search, WHERE, rank, ORDER/GROUP </li></ul><ul><ul><li>“ Cheap” boolean searching first ...
Group By (1) <ul><li>SetGroupBy </li></ul><ul><li>SetGroupDistinct </li></ul>
Group By – SetGroupBy(2) <ul><li>function SetGroupBy ( $attribute, $func, $groupsort=&quot;@group desc&quot; ) </li></ul><...
Group By – SetGroupDistinct(3) <ul><li>function SetGroupDistinct ( $attribute ) </li></ul><ul><ul><li>$cl->SetGroupBy ( &q...
结果高亮( BuildExcerpts ) <ul><li>function BuildExcerpts ( $docs, $index, $words, $opts=array() ) </li></ul><ul><ul><li>before...
索引规划 <ul><li>近实时索引 </li></ul><ul><ul><li>Main  +  Delta </li></ul></ul><ul><li>实时索引 </li></ul><ul><ul><li>Main  +  RTIndex...
Q&A <ul><li>【 Future Discussion 】 </li></ul><ul><ul><li>Tokenizer </li></ul></ul><ul><ul><li>分布式索引 </li></ul></ul><ul><ul>...
Upcoming SlideShare
Loading in …5
×

Coreseek/Sphinx 全文检索实践指南

4,323 views

Published on

北京地区PHP爱好者2010聚会[12月19日胜利举办,CU、ThinkinginLamp联办],nzinfo主讲《Coreseek/Sphinx 全文检索实践指南》,详情见详情goo.gl/xCCxy或goo.gl/j89N9

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,323
On SlideShare
0
From Embeds
0
Number of Embeds
269
Actions
Shares
0
Downloads
76
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide
  • Boolean 在 20 世纪 80 年代非常流行,直到现在,很多传统系统仍然在使用 Boolean 模型进行工作。 传统的研究者认为, Boolean 模型可以精确的找到他们想要的内容,而不会丢失信息 现代的研究发现,基于统计的模型往往比人工精心调整的 Boolean 检索式带来更好的结果
  • Coreseek/Sphinx 全文检索实践指南

    1. 1. Coreseek/Sphinx 全文检索实践指南 <ul><li>李沫南 </li></ul><ul><li>2010-12-19 </li></ul>
    2. 2. What will be covered? <ul><li>A Introduction of Fulltext Search </li></ul><ul><li>Brief Compare of Open Source FT Engines </li></ul><ul><li>Why choose Sphinx </li></ul><ul><li>Who using Sphinx </li></ul>
    3. 3. 全文检索 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>
    4. 4. 数据库的全文索引 <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>
    5. 5. 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>
    6. 6. 全文检索技术的宗教传统 <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>
    7. 7. 倒排索引历史 <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>
    8. 8. 圣经倒排索引的假设 <ul><li>所有词语具有一样的重要性 </li></ul><ul><li>不考虑词语出现的先后顺序 </li></ul><ul><li>分章、分节 </li></ul><ul><li>不考虑排序(按照出现的先后顺序排序) </li></ul>
    9. 9. 全文检索的最简化模型 <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>
    10. 10. 全文检索 向量空间模型 <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>
    11. 11. 全文检索 概率模型 <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>
    12. 12. 向量空间模型的优缺点 <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>
    13. 13. 开源检索系统的对比分析 <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>
    14. 14. 如何评价检索系统? <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>
    15. 15. 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>
    16. 16. Sphinx (Coreseek) 特性介绍( 1 ) <ul><li>高速建立索引; </li></ul><ul><li>丰富的查询表达式( AND OR NOT 句子 段落 模糊 @ 字段) </li></ul><ul><li>多种结果后处理机制( Group By , Order By , Custom Weighting ) </li></ul><ul><li>在生产环境中,千万篇文档, Tb 级索引,数千查询 / 秒 </li></ul>
    17. 17. 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>
    18. 18. 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>
    19. 19. 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>
    20. 20. 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>
    21. 21. 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>
    22. 22. 吹牛时间(酒精考验的 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>
    23. 23. A Short Break
    24. 24. Indexer 的流程 <ul><li>读取数据 </li></ul><ul><ul><li>从数据库中读取 </li></ul></ul><ul><ul><li>用户主动 Push ( RTIndex ) </li></ul></ul><ul><li>Tokenizer </li></ul><ul><ul><li>西文 (词根、缩写的解读) </li></ul></ul><ul><ul><li>CJK (切分) </li></ul></ul><ul><li>建立 [ 倒排 ] 索引 </li></ul><ul><ul><li>局部倒排 </li></ul></ul><ul><ul><li>合并 </li></ul></ul>
    25. 25. Check The Index <ul><li>Use Search utility to query a index in cli </li></ul><ul><li>Use index_tool to dump a index </li></ul>
    26. 26. 索引文件格式(简介) <ul><li>.spi: </li></ul><ul><ul><li>Dictionary (the complete list of wordid’s) </li></ul></ul><ul><li>.spa: </li></ul><ul><ul><li>Attributes (only if docinfo=extern) </li></ul></ul><ul><li>.spd: </li></ul><ul><ul><li>Document lists (for each keyword) </li></ul></ul><ul><li>.spp: </li></ul><ul><ul><li>Hit lists (for each keyword) </li></ul></ul><ul><li>.spm: </li></ul><ul><ul><li>MVA values </li></ul></ul>
    27. 27. How Searching works <ul><li>For each local index </li></ul><ul><li>Build a list of candidates (documents that satisfy the full-text query) </li></ul><ul><li>Filter (the analogy is WHERE) </li></ul><ul><li>Rank (compute the documents’ relevance values) </li></ul><ul><li>Sort (the analogy is ORDER BY) </li></ul><ul><li>Group (the analogy is GROUP BY) </li></ul><ul><li>Merge the results from all the local indexes </li></ul>
    28. 28. SQL 数据源:处理流程 <ul><li>Connected to the database </li></ul><ul><li>Pre-query* : initial setup </li></ul><ul><li>Main query : feed data </li></ul><ul><li>Post-query : cleanup </li></ul><ul><li>Disconnected </li></ul><ul><li>Sorting ........ </li></ul><ul><li>Connect to preform post-index & disconnected </li></ul>
    29. 29. MMSeg & Other Tokenizer (1) <ul><li>MMSeg 的历史 </li></ul><ul><ul><li>从 CRFSeg 简化而来 </li></ul></ul><ul><ul><li>早期阶段:内置集成 </li></ul></ul><ul><ul><li>现在:外挂,仅处理中文 </li></ul></ul><ul><ul><li>未来:全外挂 </li></ul></ul><ul><li>对配置的增加( index 节) </li></ul><ul><ul><li>charset_dictpath </li></ul></ul><ul><ul><li>charset_type : zh_cn.utf-8 </li></ul></ul><ul><ul><li>charset_debug </li></ul></ul>
    30. 30. MMSeg & Other Tokenizer (2) <ul><li>字段设置 </li></ul><ul><ul><li>prefix_fields </li></ul></ul><ul><ul><ul><li>prefix_fields = url, domain </li></ul></ul></ul><ul><ul><li>infix_fields </li></ul></ul><ul><li>Phrase 设置 </li></ul><ul><ul><li>phrase_boundary </li></ul></ul><ul><ul><ul><li>phrase_boundary = ., ?, !, U+2026 </li></ul></ul></ul><ul><ul><li>phrase_boundary_step </li></ul></ul>
    31. 31. 构建索引( Indexer ) <ul><li>执行 </li></ul><ul><ul><li>indexer --config csft.conf –all </li></ul></ul><ul><ul><li>indexer --config csft.conf {the index name} </li></ul></ul><ul><ul><li>indexer --config csft.conf {the index name} –rotate </li></ul></ul><ul><li>定期重建 </li></ul><ul><ul><li>Crontab ? </li></ul></ul><ul><ul><li>TaskKit (Python) </li></ul></ul><ul><li>Now we have the index !! </li></ul>
    32. 32. Searchd ..... <ul><li>推荐的连接方式 </li></ul><ul><ul><li>Sphinx API </li></ul></ul><ul><ul><ul><li>PHP Python Ruby Perl </li></ul></ul></ul><ul><ul><li>SphinxQL </li></ul></ul><ul><ul><ul><li>MySQL 兼容客户端 </li></ul></ul></ul><ul><ul><li>Restful API </li></ul></ul><ul><ul><ul><li>By Coreseek , in developing </li></ul></ul></ul>
    33. 33. Demo Code [PHP Client Side] <ul><li>Create a client object </li></ul><ul><li>Set up the options </li></ul><ul><li>Fire the query </li></ul><?php include ( “sphinxapi.php” ); $cl = new SphinxClient (); $cl->SetMatchMode ( SPH_MATCH_PHRASE ); $cl->SetSortMode ( SPH_SORT_EXTENDED, “price desc” ); $res = $cl->Query ( “ipod nano”, “products” ); var_dump ( $res ); ?>
    34. 34. Demo Result [ PHP Client Side] <ul><li>Matches will always have document ID, weight </li></ul><ul><li>Matches can also have numeric attributes </li></ul><ul><li>* No string attributes yet (pull them from MySQL) </li></ul>print_r ( $result[“matches”][0] ): Array ( [id] => 123 [weight] => 101421 [attrs] => Array ( [group_id] => 12345678901 [added] => 1207261463 ) )
    35. 35. DB Vs. Sphinx Who take the job? <ul><li>SQL query parts that can be moved to Sphinx </li></ul><ul><ul><li>Filtering – WHERE vs. SetFilter() or fake keyword </li></ul></ul><ul><ul><li>Sorting – ORDER BY vs. SetSortMode() </li></ul></ul><ul><ul><li>Grouping – GROUP BY vs. SetGroupBy() </li></ul></ul><ul><li>Up to 100x (!) improvement vs. “naïve” approach </li></ul><ul><li>Rule of thumb – move everything you can from MySQL to Sphinx </li></ul>
    36. 36. Sphinx Searching pipeline <ul><li>Search, WHERE, rank, ORDER/GROUP </li></ul><ul><ul><li>“ Cheap” boolean searching first </li></ul></ul><ul><ul><li>Then filters (WHERE clause) </li></ul></ul><ul><ul><li>Then “expensive” relevance ranking </li></ul></ul><ul><ul><li>Then sorting (ORDER BY clause) and/or grouping (GROUP BY clause) </li></ul></ul>
    37. 37. Group By (1) <ul><li>SetGroupBy </li></ul><ul><li>SetGroupDistinct </li></ul>
    38. 38. Group By – SetGroupBy(2) <ul><li>function SetGroupBy ( $attribute, $func, $groupsort=&quot;@group desc&quot; ) </li></ul><ul><ul><li>$attribute: read which attribute </li></ul></ul><ul><ul><li>$func: 加工 $attribute </li></ul></ul><ul><ul><ul><li>SPH_GROUPBY_[DAY|WEEK|MONTH|YEAR] </li></ul></ul></ul><ul><ul><ul><li>SPH_GROUPBY_ATTR </li></ul></ul></ul><ul><ul><li>$groupsort: Sort the grouping order. </li></ul></ul>
    39. 39. Group By – SetGroupDistinct(3) <ul><li>function SetGroupDistinct ( $attribute ) </li></ul><ul><ul><li>$cl->SetGroupBy ( &quot;category&quot;, SPH_GROUPBY_ATTR, &quot;@count desc&quot; ); </li></ul></ul><ul><ul><li>$cl->SetGroupDistinct ( &quot;vendor&quot; ); </li></ul></ul><ul><li>SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @count FROM products GROUP BY category ORDER BY @count DESC </li></ul>
    40. 40. 结果高亮( BuildExcerpts ) <ul><li>function BuildExcerpts ( $docs, $index, $words, $opts=array() ) </li></ul><ul><ul><li>before_match | after_match </li></ul></ul><ul><li>$docs : 要高亮的文本,数组形式 </li></ul><ul><li>$index: 制定文本切分方案 </li></ul><ul><li>$words: 要高亮的词 </li></ul><ul><li>@return 高亮的结果,数组形式 </li></ul><ul><li>高亮的问题? </li></ul>
    41. 41. 索引规划 <ul><li>近实时索引 </li></ul><ul><ul><li>Main + Delta </li></ul></ul><ul><li>实时索引 </li></ul><ul><ul><li>Main + RTIndex </li></ul></ul><ul><li>数据分区 </li></ul><ul><ul><li>按板块 </li></ul></ul><ul><ul><li>按时间 </li></ul></ul><ul><ul><li>按 docID </li></ul></ul>
    42. 42. Q&A <ul><li>【 Future Discussion 】 </li></ul><ul><ul><li>Tokenizer </li></ul></ul><ul><ul><li>分布式索引 </li></ul></ul><ul><ul><li>性能开销 </li></ul></ul><ul><ul><li>同一功能,不同的实现 (Attribute Vs. Fake word) </li></ul></ul>

    ×