Восстановление поискового индекса вики Screwturn
Моя вики начала возвращать неполные результаты поиска.
Пользователь будет искать термин, который, как он знает, является частью статьи, и статья не возвращается в результатах.
Они могут просмотреть статью и увидеть, что страница содержит поисковый запрос.
Это часто случалось, поэтому я пытался найти решение. Я не смог найти никого, кто имел эту проблему. Поисковый индекс в настоящее время считает, что в вики есть 300 страниц, хотя на самом деле их 1193.
Я следовал инструкциям на сайте Screwturn для перестройки индекса, включая настройку таймаута в web.config. Я закончил с несколькими попытками перестроений и около 70 ошибок между попытками. Я видел ошибки тайм-аута и нарушения первичного ключа. Восстановление не будет продолжаться очень долго, обычно менее 10 минут.
У кого-нибудь был успех с перестройкой индекса?
Кто-нибудь видел подобные ошибки и был в состоянии их устранить?
Кто-нибудь знает, что я могу ожидать, когда восстановление будет завершено? Я думал, что увижу новый поисковый индекс, который ссылается на 1193 страницы вместо 300. Это правильно?
Любая помощь будет оценена.
Ниже приведены три примера сообщений об ошибках, которые я видел.
System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UQ_IndexDocument'. Cannot insert duplicate key in object 'dbo.IndexDocument'. The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at ScrewTurn.Wiki.Plugins.SqlCommon.SqlClassBase.ExecuteNonQuery(DbCommand command, Boolean close, Boolean logError)
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at ScrewTurn.Wiki.Plugins.SqlCommon.SqlClassBase.ExecuteNonQuery(DbCommand command, Boolean close, Boolean logError)
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_IndexDocument'. Cannot insert duplicate key in object 'dbo.IndexDocument'. The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at ScrewTurn.Wiki.Plugins.SqlCommon.SqlClassBase.ExecuteNonQuery(DbCommand command, Boolean close, Boolean logError)
(Обновление 7/30) Я попытался удалить записи IndexDocument и снова запустил пересборку, но в итоге получил те же результаты. Индекс не увеличился в размере. Я просмотрел записи в таблице IndexDocument, и они останавливаются в M статьях одного из пространств имен. Это объясняет, почему поиск не выполняется по словам, начинающимся после M. Кроме того, индексируются только два пространства имен. Я смотрел домашнюю страницу администратора, пока индекс перестраивался, и ждал, когда колеса перестанут вращаться. Казалось, ничего не изменилось. Я проверил системный журнал и не увидел никаких ошибок. Как только я перезапустил приложение с домашней страницы администратора, в журнале снова появилась ошибка тайм-аута. Это оставляет мне больше вопросов, чем ответов.
Что является индикатором того, что индекс был успешно перестроен или индекс перестал перестраиваться? Я думал, что это были вращающиеся колеса, которые запускаются после того, как была нажата ссылка на восстановление.
Я исследовал ошибку тайм-аута, и все указывает на слишком короткое значение тайм-аута, и в сообщениях на форуме говорится, чтобы обновить значение тайм-аута в коде.NET или настроить свойство ожидания запроса на сервере. У кого-нибудь был успех с этим, и что вы делали?
Кто-нибудь знает, какой скрипт запускается вики для перестройки индекса? Можно ли запустить его вручную с сервера SQL?
Обновление: я должен был отказаться от нахождения моих ответов. Я узнал, что вы можете заставить индекс перестраивать одну статью за раз, просто обновляя частицы, которые не перечислены в таблице IndexDocument. Хотя это работает, это приводит к неожиданному поведению при просмотре страницы AllPages из любого пространства имен, в котором вы находитесь. На странице AllPages обычно перечислены все статьи (и буквы для каждого раздела) в алфавитном порядке. После этого принудительного обновления страница AllPages будет отображать страницы в алфавитном порядке, но порядок разделов будет похож на "#, A, B". Следующая партия страниц будет "B, C, K" и так далее. Вряд ли идеально, но поиск снова работает. Просто к сведению, у кого-то еще есть проблемы, есть обходной путь. Это должно быть моим окончательным решением, так как вики выйдет на пенсию и переместится в более надежную (и поддерживаемую!) Базу знаний. Спасибо Dreamwalker и Дуг.
2 ответа
Проверьте страницу без содержимого страницы и удалите эти страницы - это исправило мой индекс.
G SYSTEM Page OnTime-Tools created
G wkrzystek Page update requested for OnTime-Tools
E SQL Server Pages Storage Provider+SYSTEM System.Data.SqlClient.SqlException: Transaction (Process ID 173) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
E SQL Server Pages Storage Provider+SYSTEM Page indexing error for OnTime-Tools (skipping page): System.NullReferenceException: Object reference not set to an instance of an object.
E SYSTEM http://websrv01/matrixwiki/Edit.aspx
System.Web thrown System.Web.HttpUnhandledException
E SYSTEM PageContent could not be retrieved for page OnTime-Tools - returning empty
У нас была та же самая проблема - у нас было только 510 из 670 страниц в нашем индексе, и содержание остановилось после "O". Я не мог найти никаких других решений, поэтому начал просматривать таблицу SQL Log. Я заметил, что страница была добавлена, но был SQL-тупик, пытающийся сохранить содержимое страницы. После этого набора ошибок каждый раз, когда страница изменялась и индекс пытался обновить, он генерировал сообщение "Не удалось получить PageContent", и индекс останавливался на этом.
Я просто пытался бороться с той же самой проблемой и проверил здесь, чтобы видеть, было ли у кого-нибудь еще решение. Вот результаты моих исследований.
Я выполнил перестройку индекса, а затем перезапустил приложение, но он по-прежнему говорит, что 20 из моих 123 страниц проиндексированы. Я помню, что это было 20 в последний раз, когда я проверял, так что кажется, что он застрял. Я не вижу ошибок в системном журнале. Версия этой установки - 3.0.5.600 (самая новая).
У меня есть несколько установок ScrewTurn, поэтому я только что проверил другую установку, которая, кажется, выполняет поиск правильно и видит, что все 190 страниц проиндексированы! Версия этой установки 3.0.2.500.
Интересно, не сломана ли индексация страниц в последней версии. Можете поделиться какой версией вы работаете? Возможно, проверка изменений между этими двумя версиями высветит проблему.