0

ファセットがアタッチされた 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 

現在、これはスコープが「グローバル」なファセットを返します。つまり、フィルター (より高度なクエリがある場合はクエリ) によってフィルター処理されません。

私は何が欠けていますか?

4

1 に答える 1

4

ファセット、発行されたクエリによってデフォルトでバインド (制限) されます。Tire 統合テスト ケースを参照してください。

反対に、フィルターはファセットを制限せ、「ファセット ナビゲーション」を可能にします (再度、統合テスト ケースを参照してください)。

あなたの例では、クエリは事実上match_allクエリであるため、ファセットを制限できないことに注意してください。


Ruby 側では、より安全な構文は次のkeyword_arrayようになります。

keyword_array = Array(keyword_array)
于 2013-01-02T20:00:21.363 に答える