0

我正在使用 Elasticsearch 和 Elasticsearch Rails gem。我有两个通过 ActiveRecord 关联的模型,我正在尝试使用 Elasticsearch 对它们进行索引和搜索。

这是我的商店模型

商店.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

我也使用 Searchkit 作为我的前端 UI。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

索引的这些设置只是示例。您可以使用不同的types,这最适合您的用例。analyzerstokenizers

有了这个,当你通过它的索引字段搜索商店时,你会得到结果job_numbercity还有state,虽然如果你想使用关联作为过滤器,搜索方法和映射会有所不同。

于 2016-11-12T20:39:33.107 回答