2016-11-12 69 views
0

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

这里是我的专卖店模式

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 

我也使用Searchkit我的前端UI。 Searchkit能够聚合并显示商店模型中的所有属性(例如商店编号和经理)。但是,它无法查看嵌套的项目。换句话说,我无法在客户下面的工作中聚合和检索job_number。我能够查看客户名称等。我曾尝试在作业和所有其他对象旁边使用类型:“嵌套”,但这没有什么区别。我曾尝试调整as_indexed_json而没有任何运气。任何人对此有任何想法?我沉迷于这一个。

回答

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 
} 

覆盖的searchstore模型是这样的:

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索引的设置仅仅是示例。您可以使用最适合您的用例的typesanalyzerstokenizers

有了这个当你搜索一个店由它的索引字段,并与job_numbercitystate就会得到结果,但如果你想使用社团如过滤器,搜索方法和映射会有所不同。

+0

感谢所有这些,我想我遵循你所说的话。我认为唯一不确定的是当你说重写as_indexed_json方法时。地址和工作都在客户模型上。那么,我应该把它放在客户模型中吗?我所拥有的层次是商店 - >顾客 - >地址或商店 - >顾客 - >工作。我了解self.addresses.map(&:city),只是想确定我放在哪里。再次感谢您的帮助。 –

+0

@MikeRiley从你发布的代码中,'store'模型'has_many''地址'和'store'也'has_many''作业',我假设'store'是你可搜索的模型,即你想搜索“商店”记录。如果是这样的话,我发布的所有内容都会进入“商店”模式。 –