使用ElasticSearch搭建動態排序引擎

本來打算至少一月一更的,結果寫完第一篇後爆忙了一段時間(眼神死)...

在這個專欄里,我不會翻譯官方文檔。所有關於ES本身的介紹,推薦直接看英文版官方文檔,或者google之。ES本身以驚人的速度在迭代,現在的中文材料很容易就跟不上最新版的節奏。特別是5.0出來之後,會有非常大的變化。

在這個專欄里,我會根據自己的實戰經驗,寫一下Elastic Search全家桶(官方自稱為Elastic Stack)的應用。從年初到現在,我個人也從ES吹,到ES與Sphinx混用,到了自造輪子的階段。ES很好用,也有坑;ES不僅僅是一個搜索引擎,配合其全家桶,可以干更多事情。我相信,告訴大家ES可以用來幹嘛,比起搬運文檔要更有價值。

第二篇文章,準備寫一下Elastic Search的一個經典、簡單的應用場景:動態排序引擎

舉個例子,現在你做了一個UGC圖床產品,需要將用戶最新PO的圖按某種順序(例如時間或熱度)排序展示出來。用戶發了圖之後,在「最新」那一頁一刷新,就能看到他/她剛發的圖,然後可以一直往下翻。圖片可能存在不同的TAG(例如「妹子圖」、「無聊圖」,甚至做二級的細分)。等等,我才不是在說某網站呢,這是個很常見的需求好么!

如果你用MySQL來實現這個需求,可以是可以。不過,隨著圖片數量和查詢請求的增加,很快就會出現性能瓶頸,產生大量的慢查詢。你需要一個高性能動態排序引擎,有以下的功能:

? 動態索引,即可以隨時增刪查改條目;

? 排序,輸入from和size(從哪到哪),根據某個數值(熱度或插入時間戳),倒序排序、輸出結果;

? Filter,例如根據TAG篩選圖片;

假定圖片是先存MySQL、再同步去ES。用MySQL存數據和保證原子性,用ES來頂查詢請求。在ES裡面,你可以這麼設計索引結構:

{n "properties": {n "id": {n "type": "long"n },n "tags": {n "type": "string"n },n "hot": {n "type": "double"n },n "new": {n "type": "double"n },n "update_time": {n "type": "date",n "format": "epoch_second"n },n "is_searchable": {n "type": "short"n }n }n}n

id:即MySQL的id,使用AUTO_INCREMENT保證唯一性。

tags:即「妹子圖」、「無聊圖」這樣的TAG,空格隔開,確保ES默認分詞器可以工作。

hot:熱度數據,例如妹子圖的OO數量(甚至威爾遜區間啥的)。

new:即上傳時間戳。

update_time:等於new。這裡是Kibana里看數用的(一定要有個date屬性)。

is_searchable:0或1,默認0,1的時候才能被搜出來。用於自動鑒黃、人工去黃啥的。

每次更新數據,同步更新到ES裡面,這個需求就做好了。什麼,這麼簡單?是的,ES把剩下的事情都完成了。

搜的時候這麼搜:

{n "from": 0,n "size": 10,n "query": {n "filtered": {n "query": {ntt"bool": {n "must": [n {n "term": {n "tags": {n "value": "妹子圖"n }n }n }n ]n }nt },n "filter": {n "or": [n {n "and": [n {nttt "term": {n "is_searchable": 1n }n }nttt]nt }ntt]n }n }n },n "sort": {n "hot": {nt "order": "desc"nt}n }n}n

稍微解釋一下這個語句。query裡面最簡單的做法是填入`"match_all": {}`,這樣可以搜所有東西出來。filter先一層or再套一層and,是便於擴展的一個寫法。

這個語句,可以把TAG=「妹子圖」的所有內容,按熱度倒序排序(嘖嘖)。注意,上面的語句並非性能最佳的寫法,如果妹子圖非常高頻,就不應用must query搜索TAG,而是應該用type或者filter來過濾。

這就是我為啥那麼喜歡用Elastic Search。ES是動態索引,新插入的數據馬上就可以被搜出來;強大的DSL,我能想到的查詢基本都能做到。

動態排序引擎這個需求,用ES幾下子就能搞定,性能還不差。


推薦閱讀:

《A Dynamic Bayesian Network Click Model for Web Search Ranking 》
我們推出了 極客搜索 1.0
搜狗要在美國上市?請問有多少營收來自莆田系醫院的墮胎收入?

TAG:Elasticsearch | 搜索引擎 |