私のウィキが不完全な検索結果を返すようになりました。
ユーザーは、記事の一部であることがわかっている用語を検索しますが、その記事は結果に返されません。
記事を参照して、そのページに検索用語が含まれていることを確認できます。
これは頻繁に発生するため、解決策を見つけようとしています。この問題を抱えている人を見つけることができませんでした。検索インデックスは現在、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 つの名前空間のみがインデックス化されています。インデックスの再構築中に管理者のホームページを見て、ホイールの回転が止まるのを待ちました。何も変わらないようでした。システムログを確認しましたが、エラーはありませんでした。管理者のホームページからアプリケーションを再起動するとすぐに、タイムアウト エラーが再びログに表示されました。これにより、答えよりも多くの質問が残ります。
インデックスが正常に再構築されたこと、またはインデックスが再構築を停止したことを示す指標は何ですか? これは、再構築リンクがクリックされた後に実行される糸車だと思いました。
タイムアウト エラーを調査しましたが、すべてが短すぎるタイムアウト値を示しており、フォーラムの投稿では、.NET コードのタイムアウト値を更新するか、サーバーのクエリ待機プロパティを調整するように指示されています。誰かがこれで成功しましたか?あなたは何をしましたか?
ウィキがインデックスを再構築するために実行しているスクリプトを知っている人はいますか? SQL サーバーから手動で実行することはできますか?
更新: 答えを見つけることをあきらめなければなりませんでした。IndexDocument テーブルにリストされていないパーティクルを更新するだけで、一度に 1 つの記事を再構築するようにインデックスを強制できることがわかりました。これは機能しますが、現在の名前空間から AllPages ページを表示すると、予期しない動作が発生します。AllPages ページには、通常、すべての記事 (および各セクションの文字) がアルファベット順に一覧表示されます。この強制更新を行うと、AllPages ページではページがアルファベット順に表示されますが、セクションの順序は「#、A、B」のようになります。ページの次のバッチは「B、C、K」などです。理想的ではありませんが、検索は再び機能します。問題を抱えている他の人のための参考までに、回避策があります。wiki は廃止され、より堅牢な (サポートされている!) ナレッジ ベースに移行するため、これが最終的な解決策になるはずです。Dreamwalker と Doug に感謝します。