我的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)
(更新7/30) 我尝试删除IndexDocument记录并再次运行重建,但最终得到了相同的结果。该指数没有增加规模。我查看了IndexDocument表中的记录,并且它们停留在其中一个命名空间的M篇文章中。这解释了为什么搜索在M之后开始的单词失败。此外,只有两个名称空间被索引。我正在重建索引时看管理员主页并等待轮子停止旋转。似乎没有任何改变。我检查了系统日志,没有看到任何错误。我从管理主页重新启动应用程序后,再次在日志中出现超时错误。这给我留下的问题多于答案。
索引成功重建的指标是什么,或者索引是否已停止重建?我认为这是在点击重建链接后运行的旋转轮。
我研究了超时错误,并且所有内容都指向超时值太短且论坛帖子说更新.NET代码中的超时值,或调整服务器上的查询等待属性。有没有人成功,你做了什么?
有没有人知道维基会运行什么脚本来重建索引?是否可以从SQL服务器手动运行它?
更新:我不得不放弃寻找答案。我确实了解到,只需更新未在IndexDocument表中列出的粒子,就可以强制索引一次重建一篇文章。虽然这确实有效,但是当您从所在的命名空间查看AllPages页面时,会导致一些意外行为.AllPages页面通常按字母顺序列出所有文章(以及每个部分的字母)。一旦我执行了强制更新,AllPages页面将按字母顺序显示页面,但这些部分的顺序类似于“#,A,B”。下一批页面将是“B,C,K”等等。很难理想,但搜索确实有效。对于其他任何有问题的人来说,只有FYI,有一个解决方法。这将是我的最终解决方案,因为维基将被淘汰并转移到更强大(并且支持!)的知识库。感谢Dreamwalker和Doug。
答案 0 :(得分: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”消息,并且索引在那里停止。
答案 1 :(得分:0)
我只是试图解决同样的问题并在这里查看是否有其他人有解决方案。以下是我的调查结果。
我执行了索引重建,然后重新启动了应用程序,但它仍然只是说我的123个页面中有20个被索引。我记得最后一次检查时这是20,所以看起来好像卡住了。我没有在系统日志中看到任何错误。此安装的版本是3.0.5.600(最新版本)。
我有一些ScrewTurn安装,所以我只检查了另一个似乎正确搜索的安装,并看到所有190页都被编入索引!此安装的版本为3.0.2.500。
我想知道最新版本的索引页面是否已损坏。你能分享一下你正在运行的版本吗?也许检查这两个版本之间的变化会突出问题。