3

私のウィキが不完全な検索結果を返すようになりました。

ユーザーは、記事の一部であることがわかっている用語を検索しますが、その記事は結果に返されません。

記事を参照して、そのページに検索用語が含まれていることを確認できます。

これは頻繁に発生するため、解決策を見つけようとしています。この問題を抱えている人を見つけることができませんでした。検索インデックスは現在、wiki に 300 ページあると考えていますが、実際には 1193 ページあります。

Web.config でタイムアウトを調整するなど、Screwturn サイトの指示に従ってインデックスを再構築しました。最終的に、何度か再構築を試み、その間に約 70 件のエラーが発生しました。タイムアウト エラーと主キー違反が発生しました。再構築は非常に長く実行され続けることはなく、通常は 10 分未満です。

インデックスの再構築に成功した人はいますか?

同じ種類のエラーを見て、解決できた人はいますか?

再構築が完了したときに何が表示されるか知っている人はいますか? 300 ページではなく 1193 ページを参照する新しい検索インデックスが表示されると思っていましたが、それでよろしいですか?

どんな助けでも大歓迎です。

以下は、表示されたエラー メッセージの 3 つの例です。

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 の後に始まる単語に対して検索が失敗する理由を説明しています。また、2 つの名前空間のみがインデックス化されています。インデックスの再構築中に管理者のホームページを見て、ホイールの回転が止まるのを待ちました。何も変わらないようでした。システムログを確認しましたが、エラーはありませんでした。管理者のホームページからアプリケーションを再起動するとすぐに、タイムアウト エラーが再びログに表示されました。これにより、答えよりも多くの質問が残ります。

  1. インデックスが正常に再構築されたこと、またはインデックスが再構築を停止したことを示す指標は何ですか? これは、再構築リンクがクリックされた後に実行される糸車だと思いました。

  2. タイムアウト エラーを調査しましたが、すべてが短すぎるタイムアウト値を示しており、フォーラムの投稿では、.NET コードのタイムアウト値を更新するか、サーバーのクエリ待機プロパティを調整するように指示されています。誰かがこれで成功しましたか?あなたは何をしましたか?

  3. ウィキがインデックスを再構築するために実行しているスクリプトを知っている人はいますか? SQL サーバーから手動で実行することはできますか?

更新: 答えを見つけることをあきらめなければなりませんでした。IndexDocument テーブルにリストされていないパーティクルを更新するだけで、一度に 1 つの記事を再構築するようにインデックスを強制できることがわかりました。これは機能しますが、現在の名前空間から AllPages ページを表示すると、予期しない動作が発生します。AllPages ページには、通常、すべての記事 (および各セクションの文字) がアルファベット順に一覧表示されます。この強制更新を行うと、AllPages ページではページがアルファベット順に表示されますが、セクションの順序は「#、A、B」のようになります。ページの次のバッチは「B、C、K」などです。理想的ではありませんが、検索は再び機能します。問題を抱えている他の人のための参考までに、回避策があります。wiki は廃止され、より堅牢な (サポートされている!) ナレッジ ベースに移行するため、これが最終的な解決策になるはずです。Dreamwalker と Doug に感謝します。

4

2 に答える 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 を取得できませんでした」というメッセージが生成され、そこでインデックスが停止しました。

于 2013-12-18T21:58:33.633 に答える
0

私はちょうどこの同じ問題と戦おうとしていたので、ここでチェックして、他の誰かが解決策を持っているかどうかを確認しました. これが私の調査の結果です。

インデックスの再構築を実行してからアプリケーションを再起動しましたが、それでも合計 123 ページのうち 20 ページがインデックスに登録されているとしか表示されません。前回チェックしたときも20だったのを覚えているので、動かなくなったようです。システム ログにエラーはありません。このインストールのバージョンは 3.0.5.600 (最新) です。

私はScrewTurnをいくつかインストールしているので、正しく検索できると思われる別のインストールを確認したところ、190ページすべてがインデックス化されていることがわかりました! このインストールのバージョンは 3.0.2.500 です。

最新バージョンではページのインデックス作成が壊れているのだろうか。実行しているバージョンを共有できますか? おそらく、これら 2 つのバージョン間の変更点を確認すると、問題が明らかになるでしょう。

于 2013-05-09T20:10:31.807 に答える