Результаты ранговых запросов - Rails - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующий запрос, который выполняет поиск в моей базе данных клиентов и делает это успешно:

SELECT  "customers".* FROM "customers" WHERE ((("customers"."first_name" IN ('John', 'Doe') OR "customers"."last_name" IN ('John', 'Doe')) OR "customers"."email" IN ('John', 'Doe')) OR "customers"."main_phone" IN ('John', 'Doe'))

Эквивалентный запрос Rails:

array = ["John","Doe","111-111-1111"]

Customer.where(first_name: array).or(customers.where(last_name: array)).or(customers.where(email: array)).or(customers.where(main_phone: array))

Это работает нормально, однако яЯ хочу оценить результаты.Например, если запись № 1 соответствует как имени, так и фамилии, я хочу, чтобы эта запись отображалась вверху моих результатов.Как я мог это сделать?

1 Ответ

0 голосов
/ 25 апреля 2018

Комбинация, где и или фактически создать один SQL-запрос без "приоритета" результатов Тебе придется 1. разбить его на отдельные запросы 2. для каждой найденной записи подсчитайте, сколько запросов было найдено 3. упорядочить результаты по этому счетчику в порядке убывания

Вот код (он может быть красивее):

class Customer < ApplicationRecord
    def self.relevance_search(query)
        matches = []
        matches << Customer.where(first_name: query)
        matches << Customer.where(last_name: query)
        matches << Customer.where(email: query)
        matches << Customer.where(main_phone: query)

        counter = {}
        matches.each do |match|
            match.each do |match_result|
                id = match_result.id
                if counter.key? id
                    counter[id] += 1
                else
                    counter[id] = 1
                end
            end
        end
        counter.map { |id, occurrences| { relevance: 100*(occurrences/4.0), customer: Customer.find(id) } }.sort_by { |r| r[:relevance] }.reverse!
    end
end

Использование:

Customer.relevance_search ["John", "Doe", "111-111-1111"]

Возвращаемое значение и массив упорядочены по релевантности в%

Наслаждайтесь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...