#mysql #ruby-on-rails-3.2 #thinking-sphinx
#mysql #ruby-on-rails-3.2 #мышление-сфинкс
Вопрос:
Как вы используете conditional or
в thinking sphinx?
Ситуация такова: у меня есть Message
модель с атрибутом sender_id и recipient_id. Я хотел бы составить этот запрос:
Message.where("sender_id = ? OR recipient_id = ?", business_id, business_id)
Прямо сейчас я дважды выполняю поиск, один для всех сообщений, у которых есть recipient_id = business_id, а другой для возврата всех сообщений, у которых есть sender_id = business_id. Затем я просто объединяю их.
Я чувствую, что есть более эффективный способ сделать это.
РЕДАКТИРОВАТЬ — Добавление индексного файла
ThinkingSphinx::Index.define :message, with: :active_record, delta: ThinkingSphinx::Deltas::DelayedDelta do
# fields
indexes body
# attributes
has job_id
has sender_id
has recipient_id
end
Ответ №1:
Sphinx не допускает логики между атрибутами, только полями. Однако обходным путем было бы объединить два столбца в третий атрибут:
has [sender_id, recipient_id], :as => :business_ids, :multi => true
И затем вы можете выполнять поиск по объединенным значениям следующим образом:
Message.search :with => {:business_ids => business_id}
Комментарии:
1. Спасибо Пэту за ответ, но когда я попробовал обходной путь, он искал только все сообщения с
sender_id
= business_id2. Индекс основан на SQL или в реальном времени?
3. Привет, что вы подразумеваете под индексом на основе SQL или в реальном времени? Если это поможет, я опубликую индексный файл.
4. В вашем индексе у вас есть
with: :active_record
, что означает, что сгенерированный индекс заполняется с помощью SQL-запросов. (Индексы реального времени, с другой стороны, заполняются через Ruby и контекст вашего приложения Rails.)5. Оказывается, в моем предложении отсутствовал параметр:
:multi => true
— который информирует Sphinx о том, что атрибут имеет несколько значений (и, следовательно, идентификаторы отправителя и получателя). Попробуйте, дайте мне знать, если это не сработает.