在Gemfile中加入
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
注意:es-model自帶了分頁(yè)插件冕茅,如果你在gemfile中有分頁(yè)蛹找,如will_paginate?或者?kaminari,要把他們放到es-model和es-rails的前面乍楚。
在需要添加搜索的model添加以下代碼:
classUniversity<ActiveRecord::BaseincludeElasticsearch::ModelincludeElasticsearch::Model::Callbacksend
完成引用后届慈,我們可以編寫search方法了:
defself.search(search)response=__elasticsearch__.search(search)end
這是一個(gè)很簡(jiǎn)單的search,通過(guò)傳入的參數(shù)直接進(jìn)行檢索臊泌。我們可以使用DSL來(lái)使我們的檢索語(yǔ)句更加滿足我們的業(yè)務(wù)需要揍拆,以下是我需要檢索一個(gè)狀態(tài)為1,并且從欄目名為name的一個(gè)檢索:
defself.search_filter(params)response=__elasticsearch__.search("query":{"filtered":{"filter":{"bool":{"must":{"term":{"status":1}},"must":{"query":{"match":{"name":params}}}}}}})end
關(guān)于es的DSL更多寫法嫂拴,大家可以訪問(wèn)這里。里面詳細(xì)的講解了query,filter等一些常用查詢猪狈,大家可以根據(jù)業(yè)務(wù)需要自行改裝辩恼。
然后我們?yōu)閙odel創(chuàng)建index, 主要給es使用:
mappingdynamic: falsedoindexes:nameindexes:tagend
我們繼續(xù)往下走,model是可以serialized成json的状共,我們使用as_indexed_json這個(gè)方法谁帕。我們可以這樣寫:
defas_indexed_json(options={})self.as_json(only: [:id,:name,:description,:status],include: {tags: {only: [:name]}})end
include的部分是處理association的,only是model本身的字段屬性匈挖。完成了以上調(diào)整康愤,我們的model搜索基本完成了征冷。如果你現(xiàn)在使用搜索誓琼,我估計(jì)還是搜索不出數(shù)據(jù)。我們要把數(shù)據(jù)導(dǎo)入給es腹侣,使用這個(gè)命令
rake environment elasticsearch:import:modelCLASS='your_model_name'FORCE=y
好啦〗嚷桑基本就完成跺株。es默認(rèn)自帶中文分詞,但是有些posts反饋說(shuō)不大好用乒省,可以使用es-rtf,集成了中文的分詞插件作儿,下載直接可以用。必須要安裝jdk晾嘶,里面有詳盡的使用方法娶吞。
相關(guān)資料
gem的README,有耐心慢慢看可以了解很多
一些快速的tutorial
http://www.sitepoint.com/full-text-search-rails-elasticsearch/?http://aaronvb.com/articles/intro-to-elasticsearch-ruby-on-rails-part-1.html?http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/