SOLR DataImportHanlder (DIH) Полная индексация - иногда наш индекс показывает почти нулевые документы во время импорта - PullRequest
0 голосов
/ 26 октября 2018

Мы запускаем SOLR 7.2.1.
Мы периодически обновляем наш индекс (полное переиндексирование) через DataImportHanlder (с clear = true).

В большинстве случаев нормальное количество документов в нашем индексе (обычно около 250 000) остается видимым во время работы DIH (поскольку оно не фиксируется до конца импорта).

Однако периодически мы сталкиваемся с проблемой, из-за которой в индексе внезапно отображается только небольшое подмножество документов (например, 20 000 из них).

Мне не удалось отследить источник этого, но у меня есть подозрение относительно причины: если кто-то изменит продукт в области администрирования нашего веб-сайта, это вызовет обновление SOLR для этого документа (с коммит). Возможно ли, что эта фиксация отдельным процессом приведет к тому, что частично завершенные данные DIH также будут зафиксированы? Если это так, это объяснило бы, почему мы иногда получаем меньший набор документов в индексе. Когда DIH завершается, счетчик документов возвращается к нормальному состоянию.

Итак, влияют ли перекрывающиеся коммиты друг на друга? Другими словами, является ли коммит «глобальным» или он влияет только на данные, изменяемые в текущем процессе?

Буду признателен за разъяснения по этому поводу.

Спасибо!

Bill

1 Ответ

0 голосов
/ 26 октября 2018

Транзакции не изолированы в Solr - фиксация или откат затронут все документы, поставленные в очередь для индекса, а не только те, которые принадлежат потоку. Это то, что вы обнаружили сами, и то, что происходит в то время, когда DIH работает за кулисами, это то, что происходит.

Обходной путь обычно состоит в том, чтобы отказаться от использования DIH и вместо этого проиндексировать все документы самостоятельно. Это даст вам полный контроль над процессом индексации. Я бы постарался избежать необходимости удалять все документы из индекса при запуске - и, если возможно, отслеживать удаленные документы (и удалять их по мере их удаления в веб-интерфейсе), а затем выполнять дополнительное массовое удаление позже (если вы подозреваете, что они не были удалены по какой-то причине).

Другой вариант - выполнить операцию DIH для отдельного индекса, а затем использовать псевдоним сбора , чтобы поменять там, где были найдены точки сбора после завершения индексации. Это позволяет вам выполнить полный индекс для отдельной коллекции, а когда он закончится, замените текущий на новый и начните обслуживать запросы с только что созданного.

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

Мой выбор - попытаться синхронизировать коллекцию Solr с вашей базой данных без использования DIH, а вместо этого полагаться на прямые обновления. Затем вы можете использовать commitWithin, чтобы разрешить нескольким потокам добавлять документы без необходимости явной фиксации в любом потоке.

...