2016-11-12 14 views
0

私はElasticsearchとElasticsearch Rails gemを使用しています。私はActiveRecordを介して関連付けられている2つのモデルを持っており、それらをElasticsearchでインデックス付けして検索しようとしています。私はまた私のフロントエンドUIとしてSearchkitを使用していますElasticsearch Railsインデックス問題

def as_indexed_json 

end 

settings index: { number_of_shards: 1 } do 
    mapping dynamic: 'false' do 
    indexes :city 
    indexes :state 
    end 
end 

はここ

store.rb

has_many :addresses 
has_many :jobs 

def as_indexed_json 
    self.as_json(include: { 
    customer: { include: { addresses: {}, jobs: {} } }, 
    vendors: {} 
    }) 
end 

settings index: { number_of_shards: 1 } do 
    mapping dynamic: 'false' do 
    indexes :id 
    indexes :store_number 
    indexes :manager 
    indexes :customer do 
     indexes :first_name 
     indexes :addresses do 
     indexes :city 
     indexes :state 
     end 
     indexes :jobs do 
     indexes :job_number 
     end 
    end 
    end 
end 

ここに私のアドレスのモデルである私の店モデルです。 Searchkitは、ストアモデル(ストア番号とマネージャなど)にあるすべての属性を集約して表示することができます。ただし、ネストされた項目を表示することはできません。言い換えれば、顧客の下にあるジョブの下でjob_numbersを集約して取得することはできません。私は顧客名などを見ることができます。私はタイプを使用しようとしました:ジョブと他のすべてのオブジェクトの隣に「ネスト」されていますが、それは違いはありません。私はas_indexed_jsonの調整も試みました。いずれにせよ、これについて何か考えている?私はこの1つに困惑しています。

答えて

0

これにあなたのas_indexed_json方法を変更してみてください:

def as_indexed_json() { 
    hash = self.as_json() 
    hash['jobs'] = self.jobs.map(&:job_number) 
    hash['address_state'] = self.addresses.map(&:state) 
    hash['address_city'] = self.addresses.map(&:city) 
    hash 
} 

オーバーライドこのようなあなたのstoreモデルでsearch

def self.search(query) 
    @search_definition = { 
    query: {} 
    } 
    unless query.blank? 
    @search_definition[:query] = { 
    bool: { 
     should: [ 
     { 
      multi_match: { 
      query: query, 
      fields: ['store_number', 'manager', 'jobs', 'address_state', 'address_city'], 
      operator: 'and' 
      } 
     } 
     ] 
    } 
    } 
    else 
    @search_definition[:query] = { match_all: {} } 
    end 
    __elasticsearch__.search(@search_definition) 
end 

あなたはまた、次のようになり、マッピングの設定を変更する必要があります。

settings index: { number_of_shards: 1 } do 
    mapping do 
    indexes :store_number, analyzer: 'keyword' 
    indexes :jobs, analyzer: 'keyword' 
    indexes :address_state, analyzer: 'keyword' 
    indexes :address_city, analyzer: 'keyword' 
    indexes :manager, type: 'multi_field' do 
      indexes :manager, analyzer: 'snowball' 
      indexes :tokenized, analyzer: 'simple' 
    end 
    end 
end 

Thesインデックスの設定は例に過ぎません。ユースケースに最も適した異なるtypes,analyzerstokenizersを使用することができます。これにより

あなたがフィルタとして関連付けを使用したい場合は、検索方法やマッピングが異なるだろうが、それは、job_numbercityともstateでもフィールドをインデックス化していますによって店舗を検索するとき、あなたは結果を得ることができます。

+0

このすべてのおかげで、私はあなたが言っていることに従うと思います。私はあなたがas_indexed_jsonメソッドをオーバーライドすると言っているときは唯一確かではないと思います。アドレスとジョブは顧客モデル上にあります。ですから、私はこれを顧客モデルに置くべきですか?私が持っている階層は、store - > customer - > addressまたはstore - > customer - > jobsです。私はself.addresses.map(&:city)を理解していますが、どこに置いていいか分かります。これに助けてくれてありがとう。 –

+0

@MikeRileyあなたが投稿したコードから、 'store'モデル' has_many' 'addresses'と' store'も 'has_many''' jobs'のように' store'があなたの検索可能なモデルであると仮定しています。 'store'レコードです。その場合、私が投稿したものはすべて 'store'モデルに入ります。 –

関連する問題