微博实时搜索
Upcoming SlideShare
Loading in...5
×
 

微博实时搜索

on

  • 5,569 views

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

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

Statistics

Views

Total Views
5,569
Views on SlideShare
5,569
Embed Views
0

Actions

Likes
20
Downloads
155
Comments
1

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • very good
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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

微博实时搜索 微博实时搜索 Presentation Transcript

  • 微博实时搜索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 LUCENE-1516LUCENE-843(性能) VS LUCENE-1516(实时)
  • Zoie由linkedin 发并 源提供一个在lucene之上的封装保证实时性快速doci<=>uid双向对应方案
  • 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合并
  • 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 parralled int arrays...... Termx 字典yz
  • PostingList textpointer frequency startPostingsPotiner endPostingsPotinerabcd......xyz PostingList
  • 查询PostingList textpointer frequency startPostingsPotiner endPostingsPotinerabcd......x 从新向旧遍历的倒排索引yz PostingList
  • Lucene PostingInfo
  • 不靠谱!!! textpointer frequency startPostingsPotiner endPostingsPotinerab lucenec 的压缩算法无法从新向旧搜索d 文档......x 从新向旧遍历的倒排索引yz PostingList
  • 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 jessicafeeder负责分词 jessica
  • 我们需要你降噪提高召回率个性化分布式 高并发分词
  • 感谢twitterMichael Busch
  • Q&A