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!