Symfony с Zend Lucene и родственными моделями (с внешними ключами) - PullRequest
1 голос
/ 05 октября 2010

Что ж, я разрабатывал приложение для Symfony 1.4 и Doctrine, когда обнаружил большой недостаток в моей реализации Zend Lucene.

У меня есть модель под названием Publication, которая связана (через отношения внешнего ключа) с несколькимидругие модели (предметы, жанры, языки, авторы и т. д.), и я получаю их имена при добавлении нового документа в указатель (используя методику Jobeet), чтобы я мог искать публикации по заданной теме,жанр, язык, автор и т. д. Проблема в том, что если по какой-то причине я решу изменить имя одной из этих связанных моделей, индекс Zend Lucene не будет обновлен.

Единственные два решения, которые я мог быпридумали:

  1. Регулярно переиндексируйте все публикации, чтобы гарантировать, что любые изменения, внесенные в соответствующие модели, будут обновлены в индексе (однако это решение не позволяет индексуобновляться в режиме реального времени)

  2. Получить все публикации, связанные с данной модельюи переиндексируйте их после обновления (используя save (), postSave (), postUpdate () или все, что вы можете придумать в Doctrine).-> Это решение выглядело великолепно ... Оно будет перестраивать индекс только для публикаций, которые связаны с обновленной моделью, верно?Что ж, если у вас есть что-то вроде тысячи (1000) публикаций, связанных с ним, обновление займет несколько минут (да, я проверял это), а в пользовательской форме это произойдет, потому что это займет более 30 секунд (и даже если это не так).t было бы плохо, если бы пользователь несколько минут смотрел на экран в ожидании загрузки страницы).

Итак, я хочу знать, есть ли другое решение?Есть ли способ обновить индекс на лету, основанный на изменении связанной модели, не повесив весь пакет?Может, поставить задачу на фон или что-то еще?Есть ли такой способ?

Если нет способа сделать это с Lucene, есть ли способ использовать полнотекстовый поиск с MySQL (с таблицами InnoDB) без использования Zend Lucene, у которого нет такого недостатка?Если есть такой инструмент, я бы с радостью реорганизовал мой код для размещения другой библиотеки.

Не могли бы вы помочь мне с этим?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Ну ... я отвечаю сам. Подумав некоторое время, я пришел к компромиссному решению.

В моей модели у меня уже есть отношение один к одному с таблицей, которая используется только для хранения метаинформации о публикации, поэтому я в итоге вставил новый столбец с именем reindex (который является «логическим»). Таким образом, каждый раз, когда я обновляю сущность, связанную с публикацией (что-то, что в производстве случается очень редко, но я хочу быть готовым к ней), она будет помечать каждую связанную с ней публикацию как нужную для переиндексации. Тогда у меня есть задача, которую можно запустить на задании cron или планировщике задач, который будет только переиндексировать публикации, помеченные как нуждающиеся в этом. Таким образом, я могу настроить запуск этой задачи несколько раз в неделю в поздние часы, чтобы обеспечить согласованность индекса.

Это не идеальное решение, но лучшее, что я могу придумать, используя только PHP и Zend Lucene.

0 голосов
/ 05 октября 2010

Документ Lucene не может быть обновлен.Вы можете удалять только попадания и повторно добавлять их обратно. По этой причине мое первоначальное решение недействительно.

Я искал альтернативные варианты для вас, и один из них привлек мое внимание: http://www.sphinxsearch.com/

Кажется, что Sphinx очень быстро индексирует, но медленнее выполняет поиск.Может быть стоит взглянуть на это.

Из того, что я читал, реализация Lucene на PHP не очень быстрая, и это нормально как поведение.Существуют способы повысить скорость индексации больших объемов данных, которые в основном включают увеличение объема оперативной памяти, чтобы Lucene мог записывать в память документы большего размера, прежде чем выгружать файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...