2016-10-06 13 views
0

Как вы добавляете условие «IS NOT NULL» для ассоциаций в поиске мышления Sphinx? Например, если мы имеем модель статьи, которая имеет следующий индекс ..Условия «НЕ НУЛЛ» для ассоциаций в поиске мышления Сфинкс

ThinkingSphinx::Index.define :article, :with => :active_record do 
    indexes subject, :sortable => true 
    indexes content 
    has pictures(:id), as: :picture_ids 
end 

..и мы хотим найти все статьи, которые содержат определенное ключевое слово и иметь картину. Статьи и фотографии не связаны простым has_many отношений

class Article < ActiveRecord::Base 
    has_many :pictures, -> { where 'pictures.type' => 'ArticlePicture' } 

Следующая строка используется для работы, как описано here, но это уже не похоже на работу :-(

Article.search(keyword, without: {picture_ids: 0}) 

Что такое правильный способ сделать это, я использую Sphinx2.2.10 и thinking-sphinx3.2.0

+0

не эксперт TS, но «имеет изображение (: ИД),» подразумевает отношение? Т.е. идентификаторы изображения загружаются из отдельной таблицы базы данных. Если это возможно, две проблемы, A) заканчивается запуском «INNER JOIN», а не «LEFT JOIN» на таблицах, поэтому записи без каких-либо изображений просто отсутствуют. Но также B), если в конечном итоге это Sphinx MVA, тогда, когда нет pics, это пустой список, а не список с одиночным 0. – barryhunter

ответ

2

Вы можете добавить дополнительный атрибут с SQL сниппета:

has "COUNT(DISTINCT pictures.id)", :as => :picture_count, :type => :integer 

А потом - как только вы запустите rake ts:rebuild - я бы ожидать, что следующие работы:

Article.search(keyword, :without => {:picture_count => 0}) 

Важно отметить, что вы по-прежнему нужна ссылка на pictures ассоциации в ваше определение индекса, чтобы обеспечить соединение SQL. Это делается с помощью существующего атрибута (picture_ids), или в противном случае вы можете заставить присоединиться, используя следующую линию в определении индекса:

join pictures