Как суммировать точки повышения результатов поиска и сортировать их?

Я имею User модель.

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

И условия:

  1. Если в описании есть фраза, дайте этому пользователю 10 баллов.
  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, если пользователь в черном списке.

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, но это не так эффективно и может быть менее выразительным / поддерживаемым.)

Вот как бы я посмотрел на этот случай -

Точки 3 и 4 кажутся очень специфичными для предметной области (т. Е. ES оказывает минимальное влияние). Т.е. во время индекса ваша сущность должна быть в состоянии определить и получить эти атрибуты (в основном вычислить этот показатель во время индекса).

Что касается пункта 2 - рассмотрим что-то вроде этого ответа, который позволяет выполнять запрос, который повышает последние документы (это логика времени запроса, следовательно, дата должна быть выведена во время запроса логики)

Если вышеупомянутые пункты касаются пунктов 2-4, реализация (1) должна быть достаточно простой, вы можете выбрать стандартный анализатор или пробел и использовать токенайзер n-граммы, если вам нужно частичное совпадение слов.

Другие вопросы по тегам