2013-05-08 5 views
3

Моя вики начала возвращать неполные результаты поиска.Пересмотр индекса викиверта 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. Кроме того, индексируются только два из пространств имен. Я смотрел главную страницу администратора, пока индекс перестраивался и ждал, пока колеса перестанут вращаться. Ничто не изменилось. Я проверил системный журнал и не увидел никаких ошибок. Как только я перезапустил приложение с домашней страницы администратора, в журнале снова появилась ошибка таймаута. Это оставляет мне больше вопросов, чем ответов.

  1. Что такое индикатор того, что индекс был успешно перестроен или что индекс остановил восстановление? Я думал, что это были вращающиеся колеса, которые запускаются после того, как щелкнули ссылку перестроения.

  2. Я исследовал ошибку таймаута, и все указывает на слишком малое значение таймаута, и сообщения в форуме говорят об обновлении значения тайм-аута в коде .NET или настройке свойства ожидания запроса на сервере. Кто-нибудь имел успех в этом и что вы сделали?

  3. Кто-нибудь знает, что скрипт запускается wiki для восстановления индекса? Можно ли запустить его вручную с SQL-сервера?

Обновление: мне пришлось отказаться от поиска ответов. Я узнал, что вы можете заставить индекс перестраивать одну статью за раз, просто обновляя частицы, которые не указаны в таблице IndexDocument.Хотя это действительно работает, это приводит к неожиданному поведению при просмотре страницы AllPages из любого пространства имен, в котором вы находитесь. На странице AllPages обычно перечислены все статьи (и буква для каждого раздела) в алфавитном порядке. После этого принудительного обновления страница AllPages отобразит страницы в алфавитном порядке, но порядок разделов будет похож на «#, A, B». Следующая партия страниц будет «B, C, K» и так далее. Вряд ли идеальный, но поиск снова работает. Просто FYI для всех, у кого есть проблемы, есть обходное решение. Это должно быть моим окончательным решением, так как вики будут удалены и переведены в более надежную (и поддерживаемую!) Базу знаний. Спасибо Dreamwalker и Doug.

+0

Первое, что нужно сделать, я думаю, сделать резервную копию! ;) Затем удалите все элементы в таблице indexdocument, затем снова заново создайте индекс. Если у вас все еще есть проблема с журналом на странице http://stw.codeplex.com, так как это выглядит как ошибка – Dreamwalker

+0

У меня наконец есть время, чтобы вернуться к этой проблеме. У меня версия 3.0.4.560. У меня есть клон вики-продукции для тестирования, не беспокоясь о том, чтобы прерывать, какое небольшое обслуживание он может предоставить сейчас. Я попробую идею Dreamwalker, а также восстановит индекс и дам вам знать результаты. –

ответ

0

Я просто пытался бороться с этой же проблемой и проверял здесь, чтобы узнать, есть ли у кого-либо другое решение. Вот результаты моих исследований.

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

У меня есть несколько установок ScrewTurn, поэтому я только что проверил другую установку, которая, кажется, правильна для поиска и показывает, что все 190 страниц проиндексированы! Версия этой установки - 3.0.2.500.

Интересно, сломаны ли страницы индексирования в новейшей версии. Можете ли вы поделиться, какую версию вы используете? Возможно, проверка изменений между этими двумя версиями позволит выделить проблему.

+2

Возможно, стоит зарегистрировать проблему на http://stw.codeplex.com – Dreamwalker

1

Проверьте страницу без содержимого страницы и удалите эти страницы - это зафиксировало мой индекс.

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 не удалось получить», и индекс остановился там.

+0

Чтобы перейти в журнал, перейдите на домашнюю страницу Wiki, нажмите ссылку «Администрирование», затем перейдите на вкладку «Системный журнал» в верхней части страницы. – bshacklett