Моя вики начала возвращать неполные результаты поиска.Пересмотр индекса викиверта wiki
Пользователь будет искать термин, который, как они знают, является частью статьи, и статья не возвращается в результатах.
Они могут перейти к статье и посмотреть, что страница содержит поисковый запрос.
Это случалось часто, поэтому я пытался найти решение. Я не смог найти кого-либо, у кого эта проблема. Индекс поиска в настоящее время считает, что в вики имеется 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)
(Update 7/30) Я попытался удаления IndexDocument записи и побежал снова восстановить, но в конечном итоге с теми же результатами. Индекс не увеличился. Я просмотрел записи в таблице IndexDocument, и они останавливаются в статьях M одного из пространств имен. Это объясняет, почему поисковые запросы терпят неудачу в отношении слов, начинающихся после M. Кроме того, индексируются только два из пространств имен. Я смотрел главную страницу администратора, пока индекс перестраивался и ждал, пока колеса перестанут вращаться. Ничто не изменилось. Я проверил системный журнал и не увидел никаких ошибок. Как только я перезапустил приложение с домашней страницы администратора, в журнале снова появилась ошибка таймаута. Это оставляет мне больше вопросов, чем ответов.
Что такое индикатор того, что индекс был успешно перестроен или что индекс остановил восстановление? Я думал, что это были вращающиеся колеса, которые запускаются после того, как щелкнули ссылку перестроения.
Я исследовал ошибку таймаута, и все указывает на слишком малое значение таймаута, и сообщения в форуме говорят об обновлении значения тайм-аута в коде .NET или настройке свойства ожидания запроса на сервере. Кто-нибудь имел успех в этом и что вы сделали?
Кто-нибудь знает, что скрипт запускается wiki для восстановления индекса? Можно ли запустить его вручную с SQL-сервера?
Обновление: мне пришлось отказаться от поиска ответов. Я узнал, что вы можете заставить индекс перестраивать одну статью за раз, просто обновляя частицы, которые не указаны в таблице IndexDocument.Хотя это действительно работает, это приводит к неожиданному поведению при просмотре страницы AllPages из любого пространства имен, в котором вы находитесь. На странице AllPages обычно перечислены все статьи (и буква для каждого раздела) в алфавитном порядке. После этого принудительного обновления страница AllPages отобразит страницы в алфавитном порядке, но порядок разделов будет похож на «#, A, B». Следующая партия страниц будет «B, C, K» и так далее. Вряд ли идеальный, но поиск снова работает. Просто FYI для всех, у кого есть проблемы, есть обходное решение. Это должно быть моим окончательным решением, так как вики будут удалены и переведены в более надежную (и поддерживаемую!) Базу знаний. Спасибо Dreamwalker и Doug.
Первое, что нужно сделать, я думаю, сделать резервную копию! ;) Затем удалите все элементы в таблице indexdocument, затем снова заново создайте индекс. Если у вас все еще есть проблема с журналом на странице http://stw.codeplex.com, так как это выглядит как ошибка – Dreamwalker
У меня наконец есть время, чтобы вернуться к этой проблеме. У меня версия 3.0.4.560. У меня есть клон вики-продукции для тестирования, не беспокоясь о том, чтобы прерывать, какое небольшое обслуживание он может предоставить сейчас. Я попробую идею Dreamwalker, а также восстановит индекс и дам вам знать результаты. –