需要帮助构建查询

时间:2015-07-24 17:03:55

标签: ruby-on-rails elasticsearch

我的模型具有嵌套的技能模型。它是一个常见的has_many例子。弹性搜索将技能索引为字符串数组。

我的问题是,我试图通过两种不同的输入来匹配这些技能。 所需的技能和奖励技能。

因此,如果我有两个查询术语,一个是必需的,一个是奖励,我想查询具有所需输入的技能属性,如果没有找到,则查询奖金输入。

我使用的是elasticsearch-rails gem。没想到我需要发布任何代码,因为这是更多的理论。 更新

class Profile
  has_many :skills
...
end
class Skill
  belongs_to :profile
end

映射

settings index: { number_of_shards: 1, number_of_replicas: 0 } do
  ...
  mapping dynamic: 'false' do
    indexes :skills, analyzer: 'keyword'
  end
  ...
end

覆盖as_json

def as_indexed_json(options={})
  hash = self.as_json(
    include: {location: { methods: [:coordinates], only: [:coordinates]    },
              locations_of_interest: { methods: [:coordinates], only: [:coordinates]}
             })
  hash['skills'] = self.skills.map(&:name)
  hash['interests'] = self.interests.map(&:name)
  hash
end

我猜本质上我希望在多个字段上执行multi_match的反向并提升一个但是搜索一个具有多个输入的字段(必需和奖励)并且不依赖于所需的搜索结果和奖励输入。这会让事情变得更清楚吗?

这是我到目前为止的查询,第一次尝试。

        if options[:required_skills].present? && options[:bonus_skills].present?
          bool do
            must do
              term skills: options[:required_skills]
            end
            should do
              term skills: options[:bonus_skills]
            end
          end
        end

1 个答案:

答案 0 :(得分:0)

class SkillContainer < ActiveRecord::Base

  has_many :skill_links, dependent: :destroy, inverse_of: :skill_container
  has_many :skills, through: :skill_links

  has_many 
end

##################################
  create_table :skill_link do |t|
    t.references :skill
    t.references :skill_container
    t.boolean :required
    t.boolean :bonus
  end
##################################
class SkillLink
  belongs_to :skill_container
  belongs_to :skill

  scope :required, -> {
    where(required: true)
  }

  scope :bonus, -> {
    where(bonus: true)
  }
end

class Skill < ActiveRecord::Base
  has_many :skill_links, dependent: :destroy, inverse_of: :skill
  has_many :skills, through: :skill_links

end

#required skills from any skill container
SkillContainer.last.skills.merge(SkillLink.required)

#bonus skills from any skill container
SkillContainer.last.skills.merge(SkillLink.bonus)

范围可与弹性搜索结合使用