ElasticSearch / Tire - Facets不会被查询过滤掉?

时间:2013-01-02 18:51:54

标签: ruby-on-rails ruby elasticsearch tire

我有一个附加了facet的ElasticSearch / Tire查询。似乎使用全局范围而不是查询范围和过滤器。

这是我的定义。我不确定如何使用过滤器。

 def self.facets_for(keyword_array, fasit, opts = {})
    keyword_array = [keyword_array] if keyword_array.is_a?(String)
    tire.search(per_page: opts[:per_page], page: opts[:page] ) do 
      query do 
        boolean { should { string '*' }}
      end
      filter :terms, :keyword => keyword_array

      facet "phrases" do terms :phrases, :size => 20 end if fasit.include?("phrases")
      facet "sentiment" do terms :sentiment end if fasit.include?("sentiment")
      facet "lang" do terms :lang end if fasit.include?("lang")
      facet "provider" do terms :provider end if fasit.include?("provider")

    end # tire search
  end 

现在,这将返回范围内“全局”的方面,即它们不会被过滤器(或查询,如果存在更复杂的查询)过滤。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

Facets 默认情况下由发出的查询绑定(限制):请参阅Tire integration test case

相反,过滤器限制小平面,使“分面导航”成为可能(再次参见integration test case)。

请注意,在您的示例中,您的查询实际上是match_all查询,因此无法限制构面。


在Ruby方面,keyword_array的更安全的构造将是:

keyword_array = Array(keyword_array)