Думающий Сфинкс или условие

#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_id

2. Индекс основан на SQL или в реальном времени?

3. Привет, что вы подразумеваете под индексом на основе SQL или в реальном времени? Если это поможет, я опубликую индексный файл.

4. В вашем индексе у вас есть with: :active_record , что означает, что сгенерированный индекс заполняется с помощью SQL-запросов. (Индексы реального времени, с другой стороны, заполняются через Ruby и контекст вашего приложения Rails.)

5. Оказывается, в моем предложении отсутствовал параметр: :multi => true — который информирует Sphinx о том, что атрибут имеет несколько значений (и, следовательно, идентификаторы отправителя и получателя). Попробуйте, дайте мне знать, если это не сработает.