Сфинкс - когда использовать 'has' и 'indexes' для полей - PullRequest
5 голосов
/ 16 января 2010

Несколько дней назад я установил Sphinx и Thinking-Sphinx на свой ruby ​​на рельсах 2.3.2, и базовый поиск отлично работает. Это значит, без каких-либо условий. Теперь я хочу отфильтровать поиск по некоторым условиям.

У меня есть модель объявлений, и индекс выглядит следующим образом:

  define_index do
    indexes title, :as => :title, :sortable => true
    indexes description, :as => :description, :sortable => true
  end

Возможно, я ошибаюсь, но я заметил, что только когда я добавил синтаксис :sortable => true к этим атрибутам, я мог использовать их в качестве условий в своем поиске. В противном случае он ничего не найдет.

Теперь я также использую плагин act_as_taggable_on, который сгенерировал мои две таблицы БД: теги и теги. У меня нет модели для тегов, просто у меня есть acts_as_taggable_on :tags, :categories в моей модели объявлений.

То, что я хотел бы сейчас сделать, - это фильтровать по тегам. Итак, я попытался добавить в свой индекс has tags(:id), :as => :tag_ids безуспешно, а также indexes tags(:id), :as => :tag_ids, но это тоже не сработало.

Как я могу построить индексы, чтобы я мог сделать что-то вроде этого:

Announcement.search 'some word', :conditions => {:tag_ids => some_id}

А также, который отличается между has и indexes

Спасибо, Brian

1 Ответ

10 голосов
/ 17 января 2010

Позвольте мне ответить на ваши вопросы в обратном порядке. indexes whatever ожидает строку, это то, что sphinx будет искать в предоставленном вами тексте.

С другой стороны, has whatever НЕ добавляет этот контент в доступные для поиска поля. Он ожидает в основном числа, потому что вы используете этот материал для сортировки и фильтрации после того, как sphinx уже выполнил поиск.

Наконец, я думаю, что вы хотите has tags(:id), :as => :tag_ids в вашей модели и :with => {:tag_ids => some_id} в вашем поиске вместо использования :conditions. Условия используются в индексированных вами текстовых полях как способ выполнения текстового поиска по определенным полям вместо всех проиндексированных полей. С используется для фильтрации результатов, используя атрибуты, которые вы указали с has whatever.

...