2013-06-25 2 views
1

есть User модель.Как суммировать boost точки elasticsearch результаты и отсортировать их?

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 

EDIT:

В пункте 4 Я хочу, чтобы сбросить счет до 0, если пользователь на черном списке.

+0

Вы используете частичное или полное совпадение описания? Как определить конечную релевантность соответствия? Есть ли какая-то логика приоритета? –

+0

Я хочу использовать частичное совпадение описания. Конечным матчем должен быть список пользователей, отсортированных по общей сумме баллов. – tomekfranek

ответ

2

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

+0

Аккуратно - не знал, что! –

+0

Карми, не могли бы вы показать мне пример, как я могу реализовать точки 3 и 4? – tomekfranek

0

Вот как я хотел бы посмотреть на это дело -

Пункты 3 и 4, как представляется, очень специфична домена (т.е. ES делает минимальное влияние). I.e во время индекса, ваша организация должна иметь возможность определить и захватить эти атрибуты (в основном вычислить этот показатель по времени индекса).

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

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