0

Elasticsearch と Elasticsearch Rails gem を使用しています。ActiveRecord を介して関連付けられている 2 つのモデルがあり、Elasticsearch でそれらのインデックスを作成して検索しようとしています。

ここに私の店のモデルがあります

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

ここに私のアドレスモデルがあります:

def as_indexed_json

end

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

また、フロント エンド UI として Searchkit を使用しています。Searchkit は、店舗モデルに含まれるすべての属性 (店舗番号やマネージャーなど) を集約して表示できます。ただし、ネストされたアイテムを表示することはできません。つまり、顧客の下にあるジョブの下の job_numbers を集計して取得することはできません。顧客名などを表示できます。ジョブと他のすべてのオブジェクトの横に type: "nested" を使用してみましたが、違いはありません。as_indexed_json を調整しようとしましたが、運もありませんでした。誰でもこれについて何か考えがありますか?私はこれに困惑しています。

4

1 に答える 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
}

次のようにモデルで をオーバーライドsearchします。store

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

これらのインデックスの設定は単なる例です。さまざまな を使用できますがtypesanalyzersそれtokenizersがユース ケースに最適です。

job_numberこれを使用すると、インデックス付きフィールドと、cityおよびを使用してストアを検索すると結果が得られますがstate、関連付けをフィルターとして使用する場合は、検索方法とマッピングが異なります。

于 2016-11-12T20:39:33.107 に答える