ElasticSearch和轮胎/ Rails:对一个方面使用两个字段

时间:2012-06-06 18:07:34

标签: ruby-on-rails search elasticsearch tire

将Elasticsearch与Rails 3和轮胎宝石一起使用。

我有几个领域的工作,但我现在有一个特殊的要求,并不确定它是否可能。 我的模型Project上有两个字段,它们都存储相同的值:Country1和Country2

允许用户为项目存储最多两个国家/地区。两者的下拉菜单都是相同的。这两个领域都不是必需的。

我想要的是一个单独的方面,“合并”来自Country1和Country2的值,并且可以智能地点击这些方面(即无论是在1还是2中都能找到它)

到目前为止,这是我的模型:(注意Country1 / 2可以是多个单词)

class Project < ActiveRecord::Base
  mapping do
    indexes :id
    indexes :title, :boost => 100
    indexes :subtitle
    indexes :country1, :type => 'string', :index => 'not_analyzed'
    indexes :country2, :type => 'string', :index => 'not_analyzed'
  end
  def self.search(params)
    tire.search(load: true, page: params[:page], per_page: 10) do
    query do
      boolean do
        must { string params[:query], default_operator: "AND" } if params[:query].present?
        must { term :country1, params[:country] } if params[:country].present?
      end
    end
    sort { by :display_type, "desc" }
    facet "country" do
      terms :country1
    end

  end
end

任何提示都非常感谢!

3 个答案:

答案 0 :(得分:6)

Tire中的此提交https://github.com/karmi/tire/commit/730813f支持聚合“条款”方面的多个字段。

界面是:

Tire.search('articles-test') do
  query { string 'foo' }
  # Pass fields as an array, not string
  facet('multi') { terms ['bar', 'baz'] }
end

答案 1 :(得分:0)

根据术语face http://www.elasticsearch.org/guide/reference/api/search/facets/terms-facet.html的弹性搜索文档,这应该是可能的:

  

多字段:

     

术语facet可以针对多个字段执行,返回   这些字段的聚合结果。例如:

{
    "query" : {
        "match_all" : {  }
    },
    "facets" : {
        "tag" : {
            "terms" : {
                "fields" : ["tag1", "tag2"],
                "size" : 10
            }
        }
    }
}

您是否尝试为术语facet提供一系列字段,例如terms :country1, :country2

答案 2 :(得分:0)

这似乎有效,但我需要对它进行更多测试:facet('country'){terms fields:[:country1,:country2]}