Использование Sphinx Search с ORM - PullRequest
       8

Использование Sphinx Search с ORM

4 голосов
/ 22 декабря 2011

Я смотрю на реализацию поиска Sphinx на нашем сайте.

Вместо того, чтобы делать странные вещи с включением новых библиотек и т. Д., Для меня более логично интегрировать его с помощью SphinxQL, посколькублизко к родному SQL.Тем не менее, я обеспокоен тем, что нам может понадобиться заново изобрести колесо, чтобы мы могли использовать Sphinx с нашей системой.

Чтобы попытаться предотвратить это, я хочу перетащить Sphinx в нашу систему ORM.*

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

В настоящее время мы используем сочетание Zend Framework и Propel

.

1 Ответ

2 голосов
/ 29 декабря 2011

Долгое время пользователь Propel, который недавно добавил Sphinx в наше приложение с помощью Zend Framework.

Примечание по Propel и MVC

Что я заметил за последние несколько летмесяцы разработки - это то, что я хотел бы использовать более непосредственные преимущества абстракции, которую обеспечивает Propel.Как вы, вероятно, знаете, Propel создает базовые классы для ORM, а также пустые классы, просто расширяя базовые.

В настоящее время большая часть бизнес-логики опирается на отдельные модели, когда точно такую ​​же логику можно просто реализовать.как методы в расширенных классах Propel.

Вы должны использовать тот же подход к реализации поиска в Sphinx.Попробуйте абстрагировать его, используя расширенные классы ORM.

Заметки о сфинксе

  1. Создание представлений для упрощения индексации :Sphinx плохо работает с расширенными подзапросами и легко запутывается функциями MySQL.Попробуйте абстрагировать данные, которые вы хотите проиндексировать, чтобы общий SQL был простым: SELECT id, field1, field2, field3 FROM MyView .Это особенно полезно, когда вы можете захотеть связать каждый документ Sphinx с учетной записью пользователя или каким-либо другим нетривиальным отношением внешнего ключа.

  2. Sphinx может индексировать только UINT : Вероятно, в большинстве случаев нет ничего проще, но вы не можете использовать UUID или отрицательные числа для обхода различных нечетных структур базы данных.

  3. Избегать дублирования идентификатора документа Внутри каждого индекса Сфинкса каждый идентификатор документа должен быть уникальным.Допустим, вы хотите сделать объекты типа A доступными для поиска, но вы хотите найти объект A с помощью поиска по тегам, комментариям и географическим позициям.Правильный способ сделать это с помощью Sphinx - создать индекс A со всеми метаданными об объекте и отдельными индексами для комментариев, тегов и географических положений и убедиться, что вы вставили атрибут sql_attr_uint mappingвернуться к объекту A , а затем выяснить, что нужно извлечь из вашего кода.

  4. Использовать последнюю версию Sphinx : Sphinx находится в стадии быстрой разработки и распространенияподобно Debian, как правило, довольно устаревшая версия в репозиториях.Если возможно, и у вас есть время, чтобы обеспечить стабильность, скомпилируйте из исходного кода (Sphinx имеет мало зависимостей, поэтому в большинстве случаев это не будет проблемой).Кроме того, код библиотеки PHP имеет систему защиты от сбоев, которая не позволяет клиентскому коду обращаться к слишком свежей версии демона поиска Sphinx.

  5. Экстент Sphinx : После того, как вы выполнили поиск, вам все равно нужно извлечь соответствующую информацию из базы данных, поскольку Sphinx будет выдавать вам только идентификаторы соответствующих записей.В некоторых ситуациях может быть целесообразно использовать что-то вроде:

    $ a = AQuery :: create () -> findByPk (ID_FROM_SPHINX)

    в цикле foreach.Но в некоторых случаях может быть слишком неэффективно полагаться на ORM, чтобы получить список, особенно если вы просто хотите перечислить несколько столбцов, например, для результатов поиска.Тогда вы могли бы вместо этого использовать пользовательский оптимизированный SQL-запрос для получения информации (это можно сделать в классах Propel).

...