Долгое время пользователь Propel, который недавно добавил Sphinx в наше приложение с помощью Zend Framework.
Примечание по Propel и MVC
Что я заметил за последние несколько летмесяцы разработки - это то, что я хотел бы использовать более непосредственные преимущества абстракции, которую обеспечивает Propel.Как вы, вероятно, знаете, Propel создает базовые классы для ORM, а также пустые классы, просто расширяя базовые.
В настоящее время большая часть бизнес-логики опирается на отдельные модели, когда точно такую же логику можно просто реализовать.как методы в расширенных классах Propel.
Вы должны использовать тот же подход к реализации поиска в Sphinx.Попробуйте абстрагировать его, используя расширенные классы ORM.
Заметки о сфинксе
Создание представлений для упрощения индексации :Sphinx плохо работает с расширенными подзапросами и легко запутывается функциями MySQL.Попробуйте абстрагировать данные, которые вы хотите проиндексировать, чтобы общий SQL был простым: SELECT id, field1, field2, field3 FROM MyView .Это особенно полезно, когда вы можете захотеть связать каждый документ Sphinx с учетной записью пользователя или каким-либо другим нетривиальным отношением внешнего ключа.
Sphinx может индексировать только UINT : Вероятно, в большинстве случаев нет ничего проще, но вы не можете использовать UUID или отрицательные числа для обхода различных нечетных структур базы данных.
Избегать дублирования идентификатора документа Внутри каждого индекса Сфинкса каждый идентификатор документа должен быть уникальным.Допустим, вы хотите сделать объекты типа A доступными для поиска, но вы хотите найти объект A с помощью поиска по тегам, комментариям и географическим позициям.Правильный способ сделать это с помощью Sphinx - создать индекс A со всеми метаданными об объекте и отдельными индексами для комментариев, тегов и географических положений и убедиться, что вы вставили атрибут sql_attr_uint mappingвернуться к объекту A , а затем выяснить, что нужно извлечь из вашего кода.
Использовать последнюю версию Sphinx : Sphinx находится в стадии быстрой разработки и распространенияподобно Debian, как правило, довольно устаревшая версия в репозиториях.Если возможно, и у вас есть время, чтобы обеспечить стабильность, скомпилируйте из исходного кода (Sphinx имеет мало зависимостей, поэтому в большинстве случаев это не будет проблемой).Кроме того, код библиотеки PHP имеет систему защиты от сбоев, которая не позволяет клиентскому коду обращаться к слишком свежей версии демона поиска Sphinx.
Экстент Sphinx : После того, как вы выполнили поиск, вам все равно нужно извлечь соответствующую информацию из базы данных, поскольку Sphinx будет выдавать вам только идентификаторы соответствующих записей.В некоторых ситуациях может быть целесообразно использовать что-то вроде:
$ a = AQuery :: create () -> findByPk (ID_FROM_SPHINX)
в цикле foreach.Но в некоторых случаях может быть слишком неэффективно полагаться на ORM, чтобы получить список, особенно если вы просто хотите перечислить несколько столбцов, например, для результатов поиска.Тогда вы могли бы вместо этого использовать пользовательский оптимизированный SQL-запрос для получения информации (это можно сделать в классах Propel).