100万件の投稿で複数の正規表現を使用して文字列を置換する最も速い方法は何ですか?

vBulletin のインポート後、インポートされた投稿の多くの部分を修正する必要があります。

古い BBcode タグを多数修正、置換、または削除する必要があります。

こちらを参照しました:Replace a string in all posts

160 万件の投稿があるため、間違いを犯したくありません。

  1. すべての投稿の文字列を置換する前に、特定の投稿 1 つだけをターゲットにしてテストすることは可能ですか?
    forum に「テスト」用の投稿を作成し、さまざまなコンテキストで多数の BB タグを含めました。

  2. 100 万件以上の投稿の文字列置換にどのくらい時間がかかりますか?
    非常に時間がかかる場合、より高速な方法はありますか?もしかしたらデータベース内のテキストを直接編集する方がよいでしょうか?

  3. 複数の置換を一度に行うことは可能ですか(例えば、[quote] タグの前後に改行を追加する、[b][i] をそれぞれ *** に置換する、[color][indent] を削除するなど)?

追記:Rails を介して生の投稿コンテンツにこれらの変更を適用し、その後すべての投稿を再ビルド(rebake)すればうまくいくでしょうか?

「いいね!」 1

私も同じ解決策を探しています。

@Canapin さん、こんにちは

約 6 ヶ月前に、vB3 から Discourse への 100 万件の投稿の移行が完了した際の知見を共有します。

vB からの移行では、移行スクリプト内で多くのカスタム Ruby コードを使用して、データクレンジングと bbcode タグのリファクタリングを行いました。

私たちの場合、vB の投稿を Discourse データベースに挿入する前に、多くの Ruby の gsub REGEX 式を実行してデータをクリーンアップするのが最も効果的でした。

そうしない場合、Discourse の生投稿に対して多数の PostgreSQL クエリを実行し、投稿を再調理(リクック)する必要があります。

綿密なテストの結果、移行後ではなく移行中にすべての前処理を行うことを決定しました。これが「完璧な移行」を「より迅速」に完了させる方法であると分かりました。

参考になれば幸いです。

「いいね!」 1

投稿だけを再インポートして、すでにインポート済みの Discourse データ(投稿 ID にリンクされているユーザー、トピック、添付ファイル、パーマリンクなど)に影響を与えない方法はあるでしょうか?

インポートには非常に時間がかかるため、何かを見落として全データを再インポートしなければならない場合、また数日かかってしまいます。

スクリプトが投稿をインポートしているときは、1 時間に約 5 万件の Discourse 投稿が作成されていました。なぜ再ビルド(rebake)にはこれほど多くの時間がかかるのでしょうか?

@Canapin さん、こんにちは

お気持ちよくわかります。最初の移行後、世界中のあらゆる場所からコピー&ペーストされた10年以上にわたるコードの整理のために、多くのカスタム Ruby コードを作成しました。文字化けや奇妙な文字セットの問題も同様です。さらに、ネストされた各種 bbcode の整理にも、移行中にきれいに処理するための多くの Ruby 特有の処理が必要でした。

これは容易な作業ではなく、非常に時間がかかり(そして無数の移行試行が必要でしたが)、当社は主にコーディングフォーラムを運営していたため、あなたのフォーラムが主にテキストのみ(コードではない)であれば、よりシンプルに処理できるはずです。

私たちのチームは、「これとあれをある程度複雑にエスケープする」といった REGEX も多数作成する必要がありました。なぜなら、何年もかけて投稿された大量のネストされた bbcode を Markdown に変換するのは容易ではないからです。また、投稿から数年経っても価値が低いと判断された bbcode の多くを削除しました。

上記のあなたの元々の質問への回答です:

はい、移行スクリプトでスキップしたいメソッドをコメントアウトするだけで大丈夫です。

実際、移行メソッドの多くを完全に書き直しましたが、vB3 の移行は過去も現在もサポートされていないことを考えると、これらは非常に優れた出発点であり、非常に役立ちました。

「いいね!」 1

それは承知していますが、単にマイグレーションスクリプトを実行すると、既存の投稿はスキップされてしまいます。

マイグレーションを再開する前にDiscourseにインポートされたすべての投稿を削除すれば、再度インポートすると以前のマイグレーションとは異なるID(Discourse投稿ID)が割り当てられ、これらの投稿への参照がすべて壊れてしまう可能性が高いと推測しています。

「いいね!」 1

はい、ことわざにもあるように、この問題には多くの解決策があります。

私の人生でこれを手掛ける必要があったのはたった一度だけで、しかももう終わったことにとても満足しています!

:slight_smile:

「いいね!」 1

可能であれば、インポーター側でそれらを修正してもらう方が、はるかに簡単です。すでに公開済みの場合、それは長く苦痛な作業になるでしょう。すでにインポートされた投稿を変更するインポートスクリプトを作成することも可能ですが、その方法に関するモデルは私は知りません。

「いいね!」 1

なるほど、インポート前に正規表現を適用するようにインポーターを修正し、できるだけ辛抱強く待ちますね!

ご返信ありがとうございます。

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.