Индекс поиска Lucene регулярно прерывается на виртуальном хостинге, когда сайт имеет большой объем доступа для записи - PullRequest
2 голосов
/ 15 ноября 2010

Я реализовал Lucene на моем сайте.Примерно раз в 4 дня мой поисковый индекс ломается.Я получаю сообщение об ошибке, в котором говорится, что индекс не читается, а на сайте отображается ошибка 500.

Я использую SSH, перестраиваю свой индекс, и все возвращается к нормальной жизни.

Единственная частьэтот проект, который немного отличается от обычного - это большое количество операций записи в БД.Я увеличиваю поле ViewCount на каждом просмотре страницы.Я предполагаю, что Lucene обновляет документ каждый раз.

Предполагая, что это проблема: есть ли способ сообщить Lucene НЕ обновлять индекс, когда мы просто увеличиваем поле счетчика?

Примечание: мой проект использует sfLucenePlugin в Symfony

NB2: сообщение об ошибке похоже на:

Sep 03 18:52:21
symfony [err] {sfException} 
File '/home/username/symfony_project/data/index/MyIndex/en/_1nws_s.del' is not readable. 
in /home/username/symfony_project/plugins/sfLucenePlugin/lib/vendor/Zend/Search/Lucene/Storage/File/Filesystem.php 
line 59

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

Вы видите подобные сообщения в своих лог-файлах?

Sep 03 18:52:21 symfony [err] {sfException} File '/home/username/symfony_project/data/index/MyIndex/en/_1nws_s.del' is not readable. in /home/username/symfony_project/plugins/sfLucenePlugin/lib/vendor/Zend/Search/Lucene/Storage/File/Filesystem.php line 59

Если да, то, возможно, ключевым моментом является то, что ваш индекс поврежден из-за большого количества одновременно открытых файлов на вашем сервере. Это ограничение, которое часто встречается на виртуальном хостинге, поскольку другие пользователи, даже если на разных виртуальных серверах, добавляют много файлов для чтения / записи, особенно для веб-серверов.

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

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

В последнем случае вы можете создать метод softUpdate() в каждом из ваших классов моделей, которые составляют часть индекса. Создайте здесь некоторую логику, которая исключает тривиальные обновления столбцов и не перехватывает обновления поискового индекса sfLucenePlugin. Теперь это не так просто, как кажется, так как sfLucenePlugin использует поведения Propel, которые запускаются «глобально» для ваших объектов ...

Решение состоит в том, чтобы редактировать поведение напрямую или отбросить поведение и написать свои собственные методы для обновления индекса. К счастью, хороший пример функций, необходимых для этого, в учебном курсе Symfony Jobeet, день 17: http://www.symfony -project.org / jobeet / 1_4 / Propel / en / 17 # chapter_17_sub_the_save_method

Недостатком здесь является то, что вам может понадобиться «перестроить» стратегию индексирования, которую вы аккуратно сформировали в синтаксисе YAML sfLucenePlugin в PHP ... Синтаксис не сложный, но сложность может быть.

Надеюсь, это имеет смысл и чем-то помогает.

1 голос
/ 15 ноября 2010

Используете ли вы NRT ? Если это так, вам никогда не нужно явно записывать на диск. Эта конфигурация очень хороша для больших объемов записи.

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

...