Thinking Sphinx - сортировка индексов не работает

Я настроил некоторые индексы, и все, кажется, работает хорошо, пока я не захотел попробовать отсортировать результаты. У меня есть несколько моделей, но та, в которой я определяю свои индексы, — «Доктор». Я определяю их так:

class SearchController < ApplicationController
  define_index do
    indexes :firstname,  :sortable => true
    indexes :lastname,   :sortable => true
    indexes :sex,        :sortable => true
    indexes practice(:name),    :as => :practice_name,    :sortable => true
    indexes practice(:address), :as => :practice_address, :sortable => true

    # Added after denormalization
    indexes county(:name),        :as => :county
    indexes municipality(:name),  :as => :municipality

    # Can only filter on integers, thus CRC32-ing
    has "CRC32(sex)", :as => :sex_filter, :type => :integer
  end
end

Поиск вроде работает нормально. При попытке сортировки по любому из атрибутов я получаю сообщение об ошибке, подобное следующему

index employee_core: атрибут сортировки «имя» не найден

Для имени, фамилии и пола. Я могу частично "решить" это, добавив

имеет имя, фамилию, пол

к блоку define_index, но я не уверен, как сделать то же самое для ссылок на другую модель (Практика) и возможно ли это вообще.

Кто-нибудь знает, что я мог сделать неправильно, чтобы :sortable => true не работал, или как я могу определить ссылки на практику как атрибуты?


Пример вызова, который я делаю для Thinking Sphinx, который не работает, как указано выше:

ThinkingSphinx.search "<some search string>", {:with=>{}, :order=>:firstname, :sort_mode=>:desc, :page=>1}

person rogerkk    schedule 14.08.2011    source источник
comment
точно, вы запускали rake ts:rebuild после добавления :sortable => true?   -  person Vasiliy Ermolovich    schedule 14.08.2011
comment
Да, я добавил :sortable =› true в первый раз, когда добавил индексы, и с тех пор я запускал rs:rebuild много раз.   -  person rogerkk    schedule 14.08.2011
comment
Я имел в виду ts:rebuild, конечно.   -  person rogerkk    schedule 14.08.2011
comment
Какой поисковый запрос, который вы используете, возвращает ошибку?   -  person pat    schedule 14.08.2011
comment
Пэт: Рад видеть участие разработчика. :-) Я не совсем уверен, как увидеть фактически выполняемый запрос. Не могли бы вы дать мне подсказку?   -  person rogerkk    schedule 14.08.2011
comment
Кстати, немного обновил вопрос, так как пример был надуман. Теперь он содержит фактический (урезанный) код, а также пример того, как я вызываю ThinkingSphinx.search.   -  person rogerkk    schedule 14.08.2011


Ответы (1)


Итак, проблема здесь в том, что поля Sphinx вообще не сортируются. Thinking Sphinx обходит это, добавляя опцию :sortable, которая добавляет атрибут с тем же именем и суффиксом _sort, то есть firstname_sort в этом примере.

Когда вы выполняете поиск по одной модели (Employee.search), Thinking Sphinx может ссылаться на эту модель и видеть, какие поля можно сортировать, и автоматически переключать firstname на firstname_sort вместо вас. Однако вы ищете по всему миру, и поэтому нет простой ссылки на TS. Таким образом, обходным путем является использование вместо этого полного имени атрибута:

ThinkingSphinx.search "foo", :order => :firstname_sort, :sort_mode => :desc

Кроме того: если вы выполняете поиск по всем индексированным моделям, убедитесь, что атрибуты, используемые в фильтрах и сортировке, существуют во всех определениях индекса.

Добавление :sortable к полям из ассоциаций также будет работать нормально, учитывая те же предостережения.

person pat    schedule 15.08.2011
comment
Ах, с облегчением увидел, что этому есть простое объяснение. Я попробую позже и проголосую/приму ответ, если это сработает. Заранее спасибо, Пэт! - person rogerkk; 16.08.2011