1

ElasticSearch と Tire を使用して、ユーザーの上位タグのリストを取得しようとしています。

この記事が浮かんでいるのを見たことがありますが、私の状況では完全には機能しません。

user_id でフィルタリングする必要があり、ヒットがまったく返されないようにすることを目指しています。これをタイヤで動作させる方法が見つかりませんでした。

私は次のことを試しました:

Tire.search 'bookmarks' do |s|
  s.query { all }
  s.facet 'tags', facet_filter: { term: { user_id: 1 } } do
    terms :tags, all_terms: true
  end
end

助けていただければ幸いです、ありがとうございます。

編集:上記のコードを使用すると、次の出力が返されます。

=> #<Tire::Search::Search:0x007fd4b0bed110 @indices=["bookmarks"], 
   @types=[], @options={}, @path="/bookmarks/_search", 
   @query=#<Tire::Search::Query:0x007fd4b0bec5d0 @value={:match_all=>{}}>, 
   @facets={"tags"=>{:terms=>{:field=>:tags, :size=>10, :all_terms=>true}, 
   :facet_filter=>{:term=>{:user_id=>1}}}}>

編集2:次のコードでやろうとしていたことを達成しました:

# Public: Returns an array of hashes, which includes the user's top
# tags and a number of items in those tags.
#
# Format follows:
#   [{'term' => 'Some Tag', 'count' => 123}, {'term' => 'Another Tag', 'count' => 321}]
#
def self.top_tag_count(user_id, number_of_tags=10)
  top_tags = tire.search search_type: 'count' do |s|
    s.query { all }
    s.filter :term, user_id: [user_id]
    s.facet 'tags', global: true do
      terms :tags, size: number_of_tags
    end
  end
  top_tags.facets['tags']['terms']
end
4

1 に答える 1

0

ファセットのタイヤ統合テストには、可能なものの多くの例が含まれています。

あなたは正しい道を進んでいるようです -- あなたは出力とあなたが見たいものを説明していませんでした.

于 2012-10-22T12:41:20.150 に答える