Широкий поиск в приложении Thinking Sphinx и работа с результатами

Вариант использования таков:

Я хотел бы, чтобы мой пользователь выполнял поиск из одного текстового поля, а затем на странице результатов поиска упорядочивал результаты по классам.

Так, например, скажем, у меня есть следующие модели, настроенные для Thinking Sphinx: Post, Comment и User. (В моей ситуации у меня около 10 моделей, но для ясности в StackOverflow я притворяюсь, что их всего 3)

Когда я выполняю поиск, похожий на: ThinkingSphinx.search 'search term', :classes => [Post, Comment, User], я не уверен, что это лучший способ просмотреть результаты и построить разделы моей страницы.

Моя первая склонность - сделать что-то вроде:

  1. Выполнить поиск
  2. Перебрать возвращенный набор результатов и выполнить результат.is_a?(ClassType)
  3. На основе ClassType добавьте элемент в 1 из 3 массивов -- @match_posts, @matching_comments или @matching_users.
  4. Передайте эти 3 переменные экземпляра на мой взгляд

Есть ли лучший или более эффективный способ сделать это? Спасибо!


person Mario Zigliotto    schedule 25.09.2011    source источник


Ответы (2)


Я думаю, все сводится к тому, что полезно для людей, использующих ваш сайт. Имеет ли смысл запускать один и тот же запрос для всех моделей? Тогда ThinkingSphinx.search, вероятно, лучше, особенно с точки зрения производительности.

Тем не менее, вы хотите сгруппировать результаты поиска по соответствующим классам? Тогда необходима сортировка. Или вы разделяете результаты каждого класса, как поиск GitHub? Тогда может оказаться целесообразным иметь отдельные коллекции, как то, о чем вы уже подумали.

На самом базовом уровне вы можете просто вернуть все, отсортированное по релевантности, а не по классу, а затем просто отображать немного разные выходные данные в зависимости от каждого результата. В этом может помочь оператор case - лучше всего сохранить как можно больше логики в помощниках и / или, возможно, в частичных?

person pat    schedule 26.09.2011
comment
Привет Пэт, спасибо за ответ. Хотя меня немного смущают ваши второй и третий абзацы. Что касается пункта 2, я пытаюсь максимально упростить поиск для своих пользователей. 1 панель поиска, введите что угодно... затем просмотрите результаты, упорядоченные по классам. т.е. сообщения, которые соответствуют вашему поиску, имена авторов, которые соответствуют вашему поиску, комментарии, которые соответствуют вашему поиску и т. д. и т. д. Я предполагаю, что мой вопрос заключается в том, КАК я могу эффективно и эффективно сортировать результаты, подобные этому? В пункте 3 вроде ничем не отличается от пункта 2... это просто... Разберитесь с рендерингом @view по сравнению с другими местами - person Mario Zigliotto; 26.09.2011
comment
Итак, похоже, вы хотите отсортировать по имени класса, а затем по релевантности в каждом наборе классов. группы. google.com/group/thinking-sphinx/browse_thread/thread/ содержит пример того, как это сделать. - person pat; 27.09.2011
comment
И тогда у меня будет помощник, который принимает аргумент (результат поиска) и отображает конкретный частичный. Конечно, вы можете просто называть партиалы так, чтобы они соответствовали ожиданиям Rails (app/views/model_name/_model_name.html.erb), и вместо этого вызывать render result. - person pat; 27.09.2011

Если у вас есть только 3 модели для поиска, почему бы вам не использовать только model.search вместо ThinkingSphinx.search . Это решит вашу проблему с выполнением result.is_a?. Это означает более простое обращение с тем, как вы хотите отображать результаты для каждого model.

person brayne    schedule 25.09.2011
comment
Это хороший момент, но на ум приходит несколько вещей: 1- в моем приложении у меня больше 10 моделей (обновил первоначальный вопрос). 2- Будет ли ваш метод заставлять ThinkingSphinx выполнять 3 поиска в своем индексе, а не один запрос? Я ищу много текста, поэтому производительность важна для меня. Благодарю. - person Mario Zigliotto; 26.09.2011