2015-09-17 77 views
0

我剛剛進入軌道開始ES和我中遇到的東西我不明白:ElasticSearch不使用所有字段(字符串數組)搜索

我有一個藝術家模型(簡化的例子) :

class Artist < ActiveRecord::Base 
    include Elasticsearch::Model 
    include Elasticsearch::Model::Callbacks 

    # simplified to get the idea 
    def get_aliases 
    ["alias1", "alias2"] 
    end 

    def as_indexed_json(options = {}) 
    self.as_json({ 
    methods: [ :get_aliases, :get_tracks ], 
    only: [ :name, :get_aliases], 
    include: { 
    get_tracks: { only: :name } }, 
    }) 
    end 
end 

我的問題是,搜索是不使用get_aliases屬性得出的結果ES:只有「name」屬性進行搜索:

我有一個開發。有一些藝術家的數據庫,他們都沒有字符串「菲爾」在裏面,但有一個「菲利普」在其別名。 當我嘗試Artist.__elasticsearch__.search('phil').count時,我得到0結果。

我已經試過Artist.all.__elasticsearch__.import獲得:

=> 0 

Artist.__elasticsearch__.refresh_index!獲得:

=> {"_shards"=>{"total"=>10, "successful"=>5, "failed"=>0}} 

(不知道的區別是兩個命令之間有什麼...),但沒有運氣:/

我的問題是因爲我使用一個字符串數組作爲屬性的事實嗎?我應該用不同的索引嗎?

歡迎任何想法/幫助!

編輯:
我使用
寶石 'elasticsearch護欄', '〜> 0.1.7'
寶石 'elasticsearch模型', '〜> 0.1.7'

和ElasticSearch安裝的服務器是1.7.1

+2

你只是路過的符號,而不是調用實際的方法。 ':get_aliases' <>'get_aliases' – omarvelous

+0

好的,沒有看到那個來! 我正在通過irb控制檯進行測試,結果在兩個實現中都有相同的結果.... 如果你想發佈一個答案,我會接受它,否則,我會明天批准我的... 謝謝! – gfd

回答

0

由於Omarvelous評論,我懂了工作,在as_indexed_json方法的不同beeing:

def as_indexed_json(options = {}) 
    self.as_json({ 
    methods: [ :get_aliases, :get_tracks ], 
    only: [ :name, :get_aliases], 
    include: { 
    get_tracks: { only: :name } }, 
    }) 
end 

應爲(注意不是get_aliases的「唯一」數組中的一個符號):

def as_indexed_json(options = {}) 
    self.as_json({ 
    methods: [ :get_aliases, :get_tracks ], 
    only: [ :name, get_aliases], 
    include: { 
    get_tracks: { only: :name } }, 
    }) 
end 

兩個實現(符號或實際的方法)會給你同樣的結果在控制檯:

irb(main):016:0> Artist.find(7).as_indexed_json 
=> {"name"=>"Mick Jagger", "get_aliases"=>["Michael Phillip Jagger"], "get_tracks"=>[]} 

但在ES中,這是完全不同的故事!

如果有人是一個很好的鏈接瞭解如何申請ES通過Rails的,我會greatfull;)再次Omarvelous

感謝;)