(30 hackdays day 15) Bonsai + LeanCloud - 要有Search!

LeanCloud(原AVOScloud,仍是喜歡這名字哈)是國內首屈一指的BaaS產品。但因爲還在快速發展期,全部仍是缺乏很多基本功能,好比搜索。好,問題來啦,搜索技術哪家強?Google?Bing?他們肯幫你的產品作搜索嗎?Google Site Search?嗯,他們能夠幫你定製一個好看的搜索結果頁,能夠輸出XML。但,除非你用他家的服務器,不然它不能用你的數據直接作搜索。假如你想要一個只搜數據庫裏某張表裏的數據,又不想讓本身的服務器,或者BaaS平臺變成阻礙。那就應該試試這個產品。html

Bonsai

咱們接觸了各類XaaS,Search as a Service也是理所固然的啦。只是這種搜索即服務也有各類形式:前端

  • 三溫暖全套服務。Site Search那種我幫你爬網頁,幫你分詞索引,幫你作Ranking,最後你告訴我個關鍵詞我就給你返回頁面URL。
  • 某些特定平臺下的搜索。好比Wordpress各類"better search, search everything"。
  • 針對數據庫的搜索引擎。數據庫當然有內置的搜索功能,Mongodb等等的document數據庫也正須要靠這個掙錢。但始終是不能知足startup簡單,快速,暴力的開發標準。尤爲是搜索並非產品的核心功能,但又是必須的狀況下。

也許還有別的哈。第三種Search as a Service更適合API Mashup起來的新產品,它不會由於你的頁面改變而須要重爬網站,也能夠快速的讓搜索引擎感知到內容的變化。
總之,搜索這事兒也是花錢就能夠快速搞定的~讓咱們看看怎麼把Bonsai和Leancloud結合起來。數據庫

logo.png

爲何要選擇Bonsai?這得從Elasticsearch提及。Elasticsearch是一個基於Lucene的搜索引擎,它最大的特色就是提供且只提供了一套標準的Schema-less的RESTful API。這套API是這個搜索引擎的所有接口。因此,咱們能夠把Elasticsearch當作一個黑盒,一個搭好就能用HTTP API往裏扔數據,往外Query結果的傻瓜搜索引擎。用BugSense的例子來看。json

tumblr_mddwolK0jO1qhxx40.png

BugSense把從手機上收集到的Crashlog扔到Google的BigTable裏(Google storage類服務),而後再扔到ElasticSearch裏,最後輸出給一個前端應用一個用複雜搜索結果組成的Report。segmentfault

LeanCloud + Bonsai

我要作的也是相似的,我有個小爬蟲,跑在LeanCloud的雲代碼裏,每次被調用都會爬一次網頁,把結果保存在數據庫裏,假設這個保存的東西的Class叫Page。服務器

AV.Cloud.define("doCrawl", function(request, response) {
  // Something like request("http://www.google.com")
  page.save().then(function(page){
    response.success({"title":"Google blahblahblah"});
  });
});

好,這時候我就想能搜到title裏有Google的Page,那就得看看Bonsai咋玩啦。
登錄首頁bonsai.io註冊一個帳號,建立一個新的Cluster。app

圖片描述

這時候你確定在尋找美妙的Get Started!但...但這裏沒有「十分鐘入門」...由於...由於作Bonsai的人在首頁就說了。less

圖片描述

// I have to...
console.log("We're developers, too")

好吧,如今去學學怎麼玩ElasticSearch吧。我就不推薦啥快速入門文章啦,請自行Google "tutorial elasticsearch"之類的(tutorial是個特別好的關鍵詞,我都想搞個自動幫你填上這個詞兒的搜索引擎了...)。
總之,咱們能夠很輕易的經過RESTful API來向Bonsai建立出來的ElasticSearch服務器灌數據。ElasticSearch中,建立數據一般也意味着索引數據。curl

curl -X PUT http://[SERVER]/[appname]/[mydatatype]/[object_id] -d '{ <document data> }'

Bonsai簡化了這個過程,在剛纔的界面裏,選擇PUT,右邊寫上path,下面寫上數據的具體的內容(固然是JSON格式的)。點擊Run,數據就進區啦。elasticsearch

圖片描述

咱們想搜一下有啥數據裏有ohuihui的話,只要寫一個Query DSL,POST到想要搜索的數據類型下,就能獲得JSON的結果啦~

POST /testapp/testdata/_search
{
    "query":{
        "query_string": {
            "query": "ohuihui"
        }
    }
}

圖片描述

夠簡單吧?一樣,只要用上面的Cluster URL做爲baseurl,用任何一種語言都很容易經過HTTP API能夠向Bonsai裏添加數據~
好,如今的問題就是,怎麼讓咱們在AVOS的數據進到Bonsai裏呢?還好,AVOS的雲代碼提供了Hook功能。在每個數據建立的時候,均可以由AVOS自動調用一段你的代碼。好比

AV.Cloud.afterSave("Page", function(request) {
  // Post the page(request.object) to Bonsai
});

這樣,每次有新的Page保存到AVOS裏的時候,Bonsai裏就會被自動添加上這個數據。而後就能夠再寫一個雲代碼來訪問Bonsai得到用戶某個query的結果。

AV.Cloud.define("search", function(request, response) {
  // Something like
  var queryBody = {
      "query":{
        "query_string": {
          "query": request.params['query']
    };
  request.post({
    url: "http://xxx.bonsai.io/testapp/testdata/_search",
    json: true,
    body: JSON.stringify(queryBody)
  })
});

That's it. 整個結構很簡單,以下圖。之後你想本身作搜索了,本身搭一個ElasticSearch,從新倒一遍數據,改一下search那個雲函數裏的BaseURL就好啦~

圖片描述

Good night, hope you like it!
相關文章
相關標籤/搜索