Как сделать запрос с Thinking Sphinx и MySQL

У меня есть следующие модели в моем приложении Rails:

class User < ActiveRecord::Base
  has_many :tags
  has_many :talents, :through => :tags
  has_many :ratings

  define_index do
    indexes [:first_name, :last_name], :as => :name, :type => :string
    has 'AVG(ratings.value)', :as => :ratings, :type => :integer
    has tags(:talent_id), :as => :talent_id
    set_property :delta => true
  end

  def self.ts_search(q, talent)
    User.search q, :with => {:talent_id => talent.id}, :order => 'ratings DESC', :sort_mode => :extended
  end
end

class Talent < ActiveRecord::Base
  has_many :users, :through => :tags
end

class Rating < ActiveRecord::Base
  belongs_to :user
  belongs_to :talent
end

Теперь мне нужно извлечь с помощью Thinking Sphinx 2.0.14 всех пользователей, которые имеют определенный талант, и отсортировать их по среднему значению оценок этого конкретного таланта.

С функцией def ts_search(q, talent) Я извлекаю всех пользователей с определенным талантом и сортирую их по среднему значению рейтингов всех талантов.

Как я могу изменить эту функцию для сортировки пользователей по среднему значению рейтингов этого конкретного таланта?

Спасибо всем!

2 ответа

Решение

Боюсь, что то, что вы пытаетесь сделать, невозможно с помощью Sphinx - у него нет концепции связанных записей, хэшей / словарей или объединений, поэтому нет способа определить, какие рейтинговые ссылки и какие таланты находятся в рамках действия каждого пользователя.

Вы можете сделать запрос "ИЛИ" и "И" следующими способами: Предположим, что вы хотите выполнить поиск с условием Или условие query_arr = ["test", "test-xyz"]

Ваш поисковый запрос, например: User.search query_arr.join("( |)") Так что ваш запрос похож на "( test)|( test-xyz)", и он будет искать всех пользователей по вашему текстовому совпадению с test или test-xyz

Вы можете сделать запрос "И", просто заменив | к &.

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