Как суммировать точки повышения результатов поиска и сортировать их?
Я имею User
модель.
class User < ActiveRecord::Base
attr_accessible :last_visited_at, :friend_id, :blacklisted
has_many :friends
end
И условия:
- Если в описании есть фраза, дайте этому пользователю 10 баллов.
- Если последний раз был менее 3 дней назад, дайте этому пользователю 5 баллов.
- Если есть друзья, дайте этому пользователю 8 баллов.
- Если занесен в черный список, покажите этого пользователя в конце списка результатов, независимо от оценки.
Как реализовать это с помощью 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-граммы, если вам нужно частичное совпадение слов.