1

我有User模型。

class User < ActiveRecord::Base
  attr_accessible :last_visited_at, :friend_id, :blacklisted
  has_many :friends
end

和条件:

  1. 如果描述中存在短语,则给该用户打 1​​0 分。
  2. 如果上次访问时间少于 3 天,则给该用户打 5 分。
  3. 如果有朋友,给这个用户8分。
  4. 如果被列入黑名单,则在结果列表的末尾显示此用户,而不是取决于分数。

如何使用 Elasticsearch 实现这一点?如何统计用户点数并对搜索结果进行排序?

现在我有

def self.search(params)
  tire.search(load: true) do
    query do
      custom_filters_score do
        query { all }

        filter do
          filter :range, last_contact_at: { gte: 3.days.ago }
          boost 1
        end

        score_mode :total
      end
    end
  end
end

编辑:

在第 4 点,如果用户在黑名单中,我想将分数重置为 0。

4

2 回答 2

2

看看custom_filters_score查询,它的目的正是如此:_score通过多少过滤器匹配一个文档来影响。轮胎集成:https ://github.com/karmi/tire/blob/master/test/integration/custom_filters_score_queries_test.rb

(当然,您可以使用custom_score查询脚本手动计算分数https://github.com/karmi/tire/blob/master/test/integration/custom_score_queries_test.rb,但这不会那么有效并且可以表现力/可维护性降低。)

于 2013-06-25T11:53:42.877 回答
0

这是我如何看待这个案例 -

第 3 点和第 4 点似乎是非常具体的领域(即 ES 影响最小)。即在索引时,您的实体应该能够确定并捕获这些属性(基本上在索引时计算此分数)。

至于第 2 点 - 考虑类似这样的答案,它允许查询提升最新文档(这是查询时间逻辑,因此要在查询逻辑时推断日期)

如果以上解决了第 2-4 点,实现 (1) 应该很容易,如果您需要单词的部分匹配,您可以选择标准或空白分析器并使用 n-gram 标记器。

于 2013-06-25T09:20:59.020 回答