我正在尝试使用ElasticSearch和Tire检索用户的顶级标签列表。
我看到this article漂浮在周围,但在我的情况下并不完全有效。
我需要通过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