微博实时搜索xuanxi@mogujie.com      汪亚军
简介于我菇街搜索实时搜索场景
大纲近实时搜索  菇街实时搜索JAVA并发编程Jessica 2.0Q&A
Lucene segment    segment 1 segment 2 segment 3 Map                           mergepolicyReduce               segment
Lucene 近实时搜索IndexWriter.setRAMBufferSizeMB() 设置rambuffer大小 LUCENE-843IndexWriter.getReader() 将ram buffer刷回RamDir 但不Commit ...
Zoie由linkedin   发并   源提供一个在lucene之上的封装保证实时性快速doci<=>uid双向对应方案
Zoie    Mem A + Disk                        Mem A + new Disk1,Mem A 添加文档立刻更新的                   1,Mem A 添加文档立刻更新的2,Disk在下次...
ZoieRAM Rebuild 也有消耗 不能常做 (无法实时)RAM变动 DISK Cache不会发送改变 数据重DISK Rebuild 无cache. fav:{ 100 to 1000} 查询是个灾难
Lucene查询快!?
Lucene查询不           快实时搜索意味着缓存常常失效没有term截断机制 也没有终端机制10万结果集耗时100ms 或者更糟
结论为了实时搜索,常常刷新创建的segment,不可取实时系统,缓存常常失效,这样我们没有办法在短时间内,遍历所有的docId
解决办法可增量的倒排索引从新向旧遍历的倒排索引可中断的查询
可增量倒排索引term 字典词频textPostingList
TermInfo      textpointer frequency startPostingsPotine   endPostingsPotinera                                    rbc      ...
PostingList      textpointer frequency startPostingsPotiner endPostingsPotinerabcd......xyz                        Posting...
查询PostingList      textpointer frequency startPostingsPotiner endPostingsPotinerabcd......x                        从新向旧遍历的...
Lucene PostingInfo
不靠谱!!!      textpointer frequency startPostingsPotiner endPostingsPotinerab          lucenec     的压缩算法无法从新向旧搜索d           ...
PostingInfodocIdposition (twitter 1-140 < 255 )
PostingInfodocIdposition (twitter 1-140 < 255 )(docId <<8 ) | (position&0xFF)
PostingListStoreint pool(GC friendly)auto expandzero copy (do not like array)
PostingListStore
PostingListStore如何连接term包含的所有片段(slice)组成一个PostingList?
PostingListStore  PostingListPointer
PostingListStore单个Term的PostingList的所有Slice组成一个双向链表                    prepointer data ...      ...   data nextpointer
PostingListStore单个Term的PostingList的所有Slice组成一个双向链表                    prepointer data ...      ...   data nextpointer     ...
可增量倒排索引!
可中断查询我们最   心最近有更新的前n条数据从新向老查询超时立马返回(HashedWheelTimer)
智能二分查找算法依次从新向旧找记录上次二分查找时候各位置数据对当前查找做智能直到skipList search + smart search + binarysearch
总结中断查询 + 从新查找PostingStore = 实时搜索
JAVA并发编程writer和reader wait free(JMM)保证reader的数据一致性(版本号)
Writer AND Readerv = 100;thread a write v = 101;   demothread b read v => 100;数据一致性 java并不能保证a写了就立马能被b看到Lock Free
JAVA内存模型happen beforevolatilememory barriervolatile 只能保证之前写的越过内存障碍*
内存屏障PostingStore越过内存屏障 => 从Term的PostingList 始指针向新查找
内存屏障单个Term的PostingList的所有Slice组成一个双向链表                    prepointer data ...      ...   data nextpointer             双向链表...
reader 数据一致性
版本号
Jessica 2.0去lucene化纯内存postingListStore从日志系统重建索引可中断查询存储原始数据(bitcask)
Jessica 2.0jessica 负责索引               jessica   monica负责打分排序  feeder                     monica               jessicafeede...
我们需要你降噪提高召回率个性化分布式 高并发分词
感谢twitterMichael Busch
Q&A
Upcoming SlideShare
Loading in …5
×

微博实时搜索

6,186 views

Published on

这张ppt不全 请转到http://www.slideshare.net/wangscu/realtimetwittersearch 这里观看

Published in: Technology
1 Comment
20 Likes
Statistics
Notes
No Downloads
Views
Total views
6,186
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
164
Comments
1
Likes
20
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 微博实时搜索

    1. 1. 微博实时搜索xuanxi@mogujie.com 汪亚军
    2. 2. 简介于我菇街搜索实时搜索场景
    3. 3. 大纲近实时搜索 菇街实时搜索JAVA并发编程Jessica 2.0Q&A
    4. 4. Lucene segment segment 1 segment 2 segment 3 Map mergepolicyReduce segment
    5. 5. Lucene 近实时搜索IndexWriter.setRAMBufferSizeMB() 设置rambuffer大小 LUCENE-843IndexWriter.getReader() 将ram buffer刷回RamDir 但不Commit LUCENE-1516LUCENE-843(性能) VS LUCENE-1516(实时)
    6. 6. Zoie由linkedin 发并 源提供一个在lucene之上的封装保证实时性快速doci<=>uid双向对应方案
    7. 7. Zoie Mem A + Disk Mem A + new Disk1,Mem A 添加文档立刻更新的 1,Mem A 添加文档立刻更新的2,Disk在下次合并之前,一直使用 2, 使用前面Mem A和Disk合并好 的 new Disk Mem A +Mem B+ Disk 1,Mem B 添加文档立刻更新的 2,Mem A 只读 与Disk合并 2,Disk 无变化 与Mem A合并
    8. 8. ZoieRAM Rebuild 也有消耗 不能常做 (无法实时)RAM变动 DISK Cache不会发送改变 数据重DISK Rebuild 无cache. fav:{ 100 to 1000} 查询是个灾难
    9. 9. Lucene查询快!?
    10. 10. Lucene查询不 快实时搜索意味着缓存常常失效没有term截断机制 也没有终端机制10万结果集耗时100ms 或者更糟
    11. 11. 结论为了实时搜索,常常刷新创建的segment,不可取实时系统,缓存常常失效,这样我们没有办法在短时间内,遍历所有的docId
    12. 12. 解决办法可增量的倒排索引从新向旧遍历的倒排索引可中断的查询
    13. 13. 可增量倒排索引term 字典词频textPostingList
    14. 14. TermInfo textpointer frequency startPostingsPotine endPostingsPotinera rbc parralled int arrays...... Termx 字典yz
    15. 15. PostingList textpointer frequency startPostingsPotiner endPostingsPotinerabcd......xyz PostingList
    16. 16. 查询PostingList textpointer frequency startPostingsPotiner endPostingsPotinerabcd......x 从新向旧遍历的倒排索引yz PostingList
    17. 17. Lucene PostingInfo
    18. 18. 不靠谱!!! textpointer frequency startPostingsPotiner endPostingsPotinerab lucenec 的压缩算法无法从新向旧搜索d 文档......x 从新向旧遍历的倒排索引yz PostingList
    19. 19. PostingInfodocIdposition (twitter 1-140 < 255 )
    20. 20. PostingInfodocIdposition (twitter 1-140 < 255 )(docId <<8 ) | (position&0xFF)
    21. 21. PostingListStoreint pool(GC friendly)auto expandzero copy (do not like array)
    22. 22. PostingListStore
    23. 23. PostingListStore如何连接term包含的所有片段(slice)组成一个PostingList?
    24. 24. PostingListStore PostingListPointer
    25. 25. PostingListStore单个Term的PostingList的所有Slice组成一个双向链表 prepointer data ... ... data nextpointer
    26. 26. PostingListStore单个Term的PostingList的所有Slice组成一个双向链表 prepointer data ... ... data nextpointer 双向链表的好处?
    27. 27. 可增量倒排索引!
    28. 28. 可中断查询我们最 心最近有更新的前n条数据从新向老查询超时立马返回(HashedWheelTimer)
    29. 29. 智能二分查找算法依次从新向旧找记录上次二分查找时候各位置数据对当前查找做智能直到skipList search + smart search + binarysearch
    30. 30. 总结中断查询 + 从新查找PostingStore = 实时搜索
    31. 31. JAVA并发编程writer和reader wait free(JMM)保证reader的数据一致性(版本号)
    32. 32. Writer AND Readerv = 100;thread a write v = 101; demothread b read v => 100;数据一致性 java并不能保证a写了就立马能被b看到Lock Free
    33. 33. JAVA内存模型happen beforevolatilememory barriervolatile 只能保证之前写的越过内存障碍*
    34. 34. 内存屏障PostingStore越过内存屏障 => 从Term的PostingList 始指针向新查找
    35. 35. 内存屏障单个Term的PostingList的所有Slice组成一个双向链表 prepointer data ... ... data nextpointer 双向链表的好处
    36. 36. reader 数据一致性
    37. 37. 版本号
    38. 38. Jessica 2.0去lucene化纯内存postingListStore从日志系统重建索引可中断查询存储原始数据(bitcask)
    39. 39. Jessica 2.0jessica 负责索引 jessica monica负责打分排序 feeder monica jessicafeeder负责分词 jessica
    40. 40. 我们需要你降噪提高召回率个性化分布式 高并发分词
    41. 41. 感谢twitterMichael Busch
    42. 42. Q&A

    ×