重建 Screwturn wiki 搜索索引

3
我的Wiki开始返回不完整的搜索结果。
用户会搜索他们知道是文章一部分的术语,但是文章没有在结果中返回。
他们可以浏览文章,并查看页面确实包含搜索术语。
这种情况经常发生,所以我一直在努力寻找解决方案。我没有找到任何人遇到过这个问题。搜索索引目前认为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后面的单词会失败。此外,只有两个命名空间正在进行索引。在重建索引时,我观察了管理主页并等待轮子停止旋转,但似乎什么都没有改变。我检查了系统日志,但没有看到任何错误。只要我从管理主页重新启动应用程序,超时错误就再次出现在日志中。这让我比之前更加疑惑。
  1. 什么是指示索引已成功重建或索引已停止重建的标志?我认为这是在单击“重建”链接后运行的旋转轮。
  2. 我已经研究过“超时”错误,并且所有信息都指向一个超时值太短,论坛帖子上说要更新.NET代码中的超时值,或者调整服务器上的查询等待属性。是否有人成功做到了这一点,你做了什么?
  3. 有人知道维基正在运行哪个脚本来重建索引吗?是否可以从SQL服务器手动运行它?
更新:我不得不放弃寻找答案。我确实了解到,您可以通过更新未列在IndexDocument表中的粒子来强制索引逐个文章进行重建。虽然这确实有效,但当从任何命名空间查看AllPages页面时,会导致一些意外行为。 AllPages页面通常按字母顺序列出所有文章(以及每个部分的字母)。一旦我完成了这次强制更新,AllPages页面将按字母顺序显示页面,但是各节的顺序类似于“#,A,B”。下一批页面将是“B,C,K”等。这远非理想,但搜索确实再次起作用。对于任何遇到问题的人,这是一个解决方法的参考。这将是我的最终解决方案,因为维基将被停用并移到更强大(和受支持的!)知识库。感谢Dreamwalker和Doug。

我认为首先要做的事情是备份! ;) 然后删除索引文档表中的所有项目,然后重新构建索引。如果问题仍然存在,请在http://stw.codeplex.com上记录问题,因为它看起来像是一个错误。 - Dreamwalker
我终于有时间回到这个问题了。我有3.0.4.560版本。我有一个生产维基的克隆版本可以进行测试,而不必担心现在它所提供的少量服务会被中断。我将尝试Dreamwalker的想法以及索引重建,并告诉您结果。 - Darth Jed
2个回答

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    

我们遇到了相同的问题-我们只有索引中的670页中的510页,内容在“O”之后停止。我找不到其他解决方案,所以开始检查SQL日志表。我注意到添加了一个页面,但存储页面内容时出现了SQL死锁。在那组错误之后,每次修改页面并尝试更新索引时,就会生成“无法检索PageContent”的消息,索引也会在那里停止。

要查看日志,请转到Wiki的主页,单击“管理”链接,然后在页面顶部单击“系统日志”选项卡。 - bshacklett

0

我刚试图解决同样的问题,并在这里查看是否有人有解决方案。以下是我的调查结果。

我执行了索引重建,然后重新启动了应用程序,但仍然只显示我的123个页面中的20个已被索引。我记得上次检查时也是20个,所以似乎卡住了。系统日志中没有任何错误。此安装版本为3.0.5.600(最新版本)。

我有几个ScrewTurn安装,所以我刚刚检查了另一个似乎可以正确搜索的安装,发现所有190个页面都已被索引!此安装版本为3.0.2.500。

我想知道最新版本是否存在页面索引问题。您能分享一下您正在运行的版本吗?也许比较这两个版本之间的更改将突出问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接