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

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

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

Реальный ответ заключается в том, что вы должны использовать sphinx, эластичный поиск или любой другой инструмент, который позволяет вам выполнять полнотекстовый поиск и ранжировать результаты (даже postgresql).

Но возможный обходной путь для наивного ранжирования может бытьпостроен из базы данных путем добавления простого match_rank для каждой записи с суммой полей, которые соответствовали, а затем упорядочение по этому полю.Примерно так:

array = ["John","Doe","111-111-1111"]
wrappped_array = "(" + array.map { |v| "'#{v}'" }.join(',') + ")"

Customer.select("customers.*, 
  ((CASE WHEN first_name in #{wrappend_array} THEN 1 ELSE 0 END) +
  (CASE WHEN last_name in #{wrappend_array} THEN 1 ELSE 0 END) +
  (CASE WHEN email in #{wrappend_array} THEN 1 ELSE 0 END) +
  (CASE WHEN main_phone in #{wrappend_array} THEN 1 ELSE 0 END)) as match_rank").
where(first_name: array).
  or(customers.where(last_name: array)).
  or(customers.where(email: array)).
  or(customers.where(main_phone: array)).
  order(match_rank: :desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...