LeanCloud(原AVOScloud,仍是喜歡這名字哈)是國內首屈一指的BaaS產品。但因爲還在快速發展期,全部仍是缺乏很多基本功能,好比搜索。好,問題來啦,搜索技術哪家強?Google?Bing?他們肯幫你的產品作搜索嗎?Google Site Search?嗯,他們能夠幫你定製一個好看的搜索結果頁,能夠輸出XML。但,除非你用他家的服務器,不然它不能用你的數據直接作搜索。假如你想要一個只搜數據庫裏某張表裏的數據,又不想讓本身的服務器,或者BaaS平臺變成阻礙。那就應該試試這個產品。html
咱們接觸了各類XaaS,Search as a Service也是理所固然的啦。只是這種搜索即服務也有各類形式:前端
也許還有別的哈。第三種Search as a Service更適合API Mashup起來的新產品,它不會由於你的頁面改變而須要重爬網站,也能夠快速的讓搜索引擎感知到內容的變化。
總之,搜索這事兒也是花錢就能夠快速搞定的~讓咱們看看怎麼把Bonsai和Leancloud結合起來。數據庫
爲何要選擇Bonsai?這得從Elasticsearch提及。Elasticsearch是一個基於Lucene的搜索引擎,它最大的特色就是提供且只提供了一套標準的Schema-less的RESTful API。這套API是這個搜索引擎的所有接口。因此,咱們能夠把Elasticsearch當作一個黑盒,一個搭好就能用HTTP API往裏扔數據,往外Query結果的傻瓜搜索引擎。用BugSense的例子來看。json
BugSense把從手機上收集到的Crashlog扔到Google的BigTable裏(Google storage類服務),而後再扔到ElasticSearch裏,最後輸出給一個前端應用一個用複雜搜索結果組成的Report。segmentfault
我要作的也是相似的,我有個小爬蟲,跑在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!