2

很长一段时间以来,我一直对应该是一个简单的查询感到头疼。我查看了 StackOverflow 上的所有文档和示例,以及关于Tire此处的大多数问题,但均未成功。

基本上,我试图根据一些相关模型的 ID 过滤我的搜索结果。

这是模型(请注意,我目前仍在使用动态映射):

class Location < ActiveRecord::Base
  belongs_to :city
  has_and_belongs_to_many :tags

  # also has a string attribute named 'kind'
end

我想要做的是按city_id、 按 1tag_id和 按过滤我的搜索查询kind

我已经尝试构建查询,但我只收到错误,因为我似乎无法正确构建它。这是我到目前为止所拥有的(不工作):

Location.search do
  query { string params[:query] } if params[:query].present?
  filter :term, { city_id: params[:city_id] } if params[:city_id].present? # I'd like to use the ids filter, but have no idea of the syntax I'm supposed to use
  filter :ids, { 'tag.id', values: [params[:tag_id]] } if params[:tag_id].present? # does not compile
  filter :match, { kind: params[:kind] } if params[:kind].present? # does not compile either
end
4

1 回答 1

3

事实证明,动态映射并不能适应这种情况。我还必须定义我的数据是如何被索引的。

这是我的映射:

mapping do
  indexes :id, index: :not_analyzed
  indexes :kind, index: :not_analyzed
  indexes :city_id, index: :not_analyzed
  indexes :tags do
    indexes :id, index: :not_analyzed
  end
end

和我的习惯to_indexed_json

def to_indexed_json
  {
    kind: kind,
    city_id: city_id,
    tags: tags.map do |t|
      {
        id: t.id
      }
    end
  }.to_json
end

最后,我可以像这样过滤:

  Location.search do
    query { string params[:query] } if params[:query].present?
    filter :term, { city_id: params[:city_id] } if params[:city_id].present?
    filter :term, { "tags.id" => params[:tag_id] } if params[:tag_id].present?
    filter :term, { kind: params[:kind] } if params[:kind].present?
  end

重要的部分是标签索引,它允许我"tags.id"在过滤器中使用。

于 2012-10-17T16:23:09.853 回答