Индексирование ThinkingSphinx ActsAsTaggable Model.tag_counts - PullRequest
0 голосов
/ 03 декабря 2010

Чтобы назначить теги, пользователи моего программного обеспечения ищут свои существующие теги (которые заполняются в автозаполнении). Я хочу проиндексировать этот поиск в Sphinx, чтобы поиск по тегам был очень отзывчивым. Я видел сообщения о том, как индексировать теги модели с помощью sphinx , что помогает при попытке найти все объекты с таким именем тега, но я хочу индексировать сам поиск тегов для людей, которые ищут существующие теги.

Я пытаюсь использовать Sphinx для этого поиска

Lead.tag_counts (: условие => ["tags.name like?", "accounting% '])

, который производит SQL

ВЫБЕРИТЬ tags.id, tags.name, COUNT () КАК СЧИТАТЬ ОТ tags ВЛЕВО ВНЕШНЕЕ СОЕДИНЕНИЕ taggings.tag_id AND taggings.context = INNER JOIN 'tags' приводит к taggings.taggable_id ГДЕ ((taggings.taggable_type = 'Lead' AND tags.name вроде 'accounting%')) GROUP BY tags.id, tags.name ИМЕЮЩИЙСЯ СЧЕТ ()

0

Я предполагаю, что мне нужно добавить индексы в модель Tag, чтобы позволить работать нижеприведенным, но не совсем уверен, какими они должны быть.

Tag.sphinx_leads_scope.search (PARAMS [: тег])

Спасибо, Джон-Пол

1 Ответ

0 голосов
/ 04 декабря 2010

Учитывая, что acts-as-taggable-on имеет собственный класс Tag, это немного сложно, но если вы поместите этот код куда-нибудь (возможно, в инициализатор?), Я думаю, что он должен работать - хотя он и не тестировался:

ActsAsTaggableOn::Tag.define_index do
  indexes name
end

Добавить область сфинкса сложнее - для этого вам понадобится обезопасить ActsAsTaggableOn :: Tag. Определенно, не может быть и речи. Вы также можете добавить фильтр для тегируемого типа с помощью тегов ... хотя строковые фильтры очень ограничены - убедитесь, что вы прочитали документы . Кроме того, если вы идете по пути строкового фильтра, у вас может быть несколько типов тегов для тега, и поэтому вы захотите объединить значения CRC32 запятыми ... проверить это несколько связанный ответ (для фрагментов кода).

...