1. 程式人生 > >快速搜尋效能問題調研

快速搜尋效能問題調研

    最近因為專案需要做搜尋,安排我對搜尋的效能這一方面做調研。本文件調研了simhash和es為代表的搜尋方案。用Simhash和ElasticSearch做搜尋各有優缺點,綜合來看可這麼標籤:Simhash是偏計算密集型的搜尋方案代表,但演算法方案複雜;ElasticSearch是IO和硬體消耗大的搜尋方案,但易用性更高;因為精力資源有限,不能親自搭建上述方案進行實際測試對比,後續條件成熟可以根據需要實際搭建測試體驗,一些資料參考網路,參考資料來備註在文件末尾。

調研過程:

名稱

具體方案

Simhash

    +

Hbase

使用效果:

比對5000w條資料相似,可3.6毫秒內實現;

處理過程:

見下圖,根據simhash code查詢對應的資料即可;

關鍵演算法實現:

Java實現:

http://www.open-open.com/lib/view/open1375690611500.html

Python實現:

https://github.com/seomoz/simhash-cluster 

優缺點:

方案複雜,查詢方便,演算法效率高,硬體開銷非常小

使用建議:

可根據檢索型別,加服務佇列,自定義simhash code庫,以鍵值對形式,根據value查Hbase。

注意點:

需根據人工測試比對,來確定海明距離/餘弦相似度的閾值。

(對於我司的應用場景,做下排序就好了)

使用案例:

谷歌的網頁去重、新浪微博相似度比較等。

ElasticSearch

    +

Hbase

使用效果:

 億萬資料查詢進行秒回;

處理過程:

根據需要,將資料儲存在es索引中,根據索引通查hbase。具體架構圖如下。

關鍵查詢演算法:

  1. 檢索的詞語分成若個片;
  2. 每片同時進行檢索;
  3. 返回全部結果。

優缺點:

方案簡單,查詢更靈活,演算法效率低,硬體開銷大

注意點:

該方案硬體開銷大,單純依賴硬體堆砌增加邊界。

700萬的資料,消耗了3個節點,各節點硬體配備的4G記憶體

使用案例:

應用比較多,海量交通資料實時存取等。

 

 

結論:用Simhash和ElasticSearch做搜尋各有優缺點,綜合來看可這麼標籤:

Simhash是偏計算密集型的搜尋方案代表,但演算法方案複雜;

ElasticSearch是IO和硬體消耗大的搜尋方案,但易用性更高;

 

Simhash的求相似度的過程:

相似度的確認過程:海明距離與相似度。

Hbase + es方案:

參考資料:

  1. 海量資料相似度計算之simhash短文字查詢   http://www.lanceyan.com/tag/simhash ;
  2. 基於mongodb+simhash叢集  https://github.com/seomoz/simhash-cluster ;
  3. Elasticsearch之四種查詢型別和搜尋原理  https://blog.csdn.net/wangyunpeng0319/article/details/78218332
  4. Elasticsearch+Hbase實現海量資料秒回查詢  https://blog.csdn.net/sdksdk0/article/details/53966430
  5. 基於HBase+ ElasticSearch的 海量交通資料實時存取方案設計 http://www.cww.net.cn/issues?id=405629&file=1
  6. ElasticSearch 與 Solr 的對比測試  http://simonlei.iteye.com/blog/1615600
  7. Elasticsearch實現原理分析  https://blog.csdn.net/zg_hover/article/details/77171014
  8. simHash 簡介以及 java 實現 http://www.open-open.com/lib/view/open1375690611500.html