100만 개 게시물에서 여러 정규식으로 문자열을 가장 빠르게 교체하는 방법은?

vBulletin 가져오기 이후, 가져온 메시지들에서 많은 부분을 수정해야 합니다.

많은 수의 오래된 BBcode 태그를 수정, 교체 또는 삭제해야 합니다.

다음 링크를 확인해 보았습니다: Replace a string in all posts

160만 개의 게시물이 있으므로 실수를 하고 싶지 않습니다.

  1. 모든 게시물에서 문자열을 교체하기 전에 테스트를 위해 특정 게시물 1개만 대상으로 할 수 있는 방법이 있을까요?
    다양한 컨텍스트에서 여러 BB태그가 포함된 “test” 게시물을 내 포럼에 생성해 두었습니다.

  2. 100만 개 이상의 게시물에서 문자열을 교체하는 데 얼마나 걸릴까요?
    시간이 많이 걸린다면 더 빠른 방법이 있을까요? 데이터베이스에서 텍스트를 직접 편집하는 것이 가능할까요?

  3. 여러 교체를 한 번에 수행할 수 있는 방법이 있을까요? (예: [quote] 태그 앞뒤에 새 줄 추가, [b]와 [i]를 **와 *로 교체, [color와 [indent] 제거 등)

수정: rails를 통해 게시물의 원본(raw) 콘텐츠에 이러한 수정 사항을 적용한 후, 모든 게시물을 다시 베이킹(rebake)하면 효과가 있을까요?

저도 같은 해결책을 찾고 있습니다.

안녕하세요 @Canapin

6개월 전 vB3에서 Discourse로 100만 개 이상의 게시글을 마이그레이트한 경험을 공유합니다.

vB에서 마이그레이트할 때, 마이그레이션 스크립트에 많은 양의 커스텀 Ruby 코드를 작성하여 데이터 정화 및 BBCode 태그 리팩터링을 수행했습니다.

이것이 우리에게 가장 잘 작동하는 방법이었죠. 게시글을 Discourse DB에 삽입하기 전에 vB 게시글에 Ruby의 gsub REGEX 표현식을 대량으로 실행하여 모든 데이터를 정리했습니다.

그렇지 않으면, Discourse의 원본(raw) 게시글에 대해 PostgreSQL 쿼리를 대량으로 실행하고 게시글을 다시 조리(recook)해야 합니다.

광범위한 테스트 후, 마이그레이션 중(이후가 아닌)에 모든 전처리(preprocessing)를 수행하기로 결정했습니다. 이것이 완벽하게 마이그레이션을 완료하는 ‘더 빠르고’ 효율적인 방법임을 확인했습니다.

도움이 되셨길 바랍니다.

이미 가져온 Discourse 데이터, 특히 게시물 ID와 연결된 데이터(사용자, 주제, 첨부파일, 영구 링크 등)에 영향을 주지 않고 게시물만 다시 가져오는 방법이 있는지 알고 싶어요.

가져오기 과정이 너무 길어서, 무언가를 잊어버려서 전체를 다시 가져와야 하면 며칠이나 더 걸릴 것 같아요.

스크립트가 게시물을 가져올 때 시간당 약 50,000개의 Discourse 게시물을 생성했어요. 왜 rebake(재처리)는 그보다 훨씬 더 오래 걸리는 걸까요?

@Canapin 님, 안녕하세요.

그 고충을 잘 이해합니다. 저희도 원래 마이그레이션을 마친 후, 수십 년 동안 전 세계 각지에서 복사해서 붙여넣은 코드를 정리하기 위해 상당한 양의 커스텀 Ruby 코드를 작성했습니다. 더不用说, 모든 문자 깨짐(mojibake) 문제와 이상한 문자 집합, 그리고 마이그레이션 중에 깔끔하게 정리하려면 많은 Ruby 특유의 처리가 필요했던 중첩된 다양한 bbcode 문제까지 있었습니다.

이를 수행하는 것은 쉽지 않았고 오랜 시간(그리고 수많은 마이그레이션 시도)이 걸렸지만, 저희는 주로 코딩 포럼이었기 때문에, 만약 님의 포럼이 대부분 텍스트(코드가 아닌)로 구성되어 있다면 훨씬 더 직관적으로 진행될 수 있을 것입니다.

저희 팀은 또한 "이것과 저것을 다소 복잡하게 이스케이프한다"는 식의 REGEX를 많이 작성해야 했습니다. 수년에 걸쳐 사람들이 그렇게 많은 중첩된 bbcode를 게시했기 때문에, 그 모든 레거시 중첩 bbcode를 마크다운으로 변환하는 것은 쉽지 않기 때문입니다. 또한 게시된 지 수년 후에 보면 가치가 거의 없다고 판단된 많은 bbcode도 제거했습니다.

위에서 질문하신 원래 질문에 답변드리자면:

네, 마이그레이션 스크립트에서 건너뛰고 싶은 메서드를 주석 처리하면 됩니다.

실제로 저희는 마이그레이션 메서드의 상당 부분을 완전히 다시 작성했지만, vB3 마이그레이션이 지원되지 않는다는 점을 고려할 때, 그것들은 매우 좋은 출발점이었고 매우 유용했습니다.

그 점은 알고 있지만, 단순히 마이그레이션 스크립트를 실행하면 기존 게시물이 건너뛰어집니다.

마이그레이션을 다시 시작하기 전에 Discourse에서 가져온 모든 게시물을 삭제하면, 다시 가져올 때 이전 마이그레이션과 다른 ID(Discourse 게시물 ID)가 설정될 것이라고 추측합니다. 그리고 이 게시물들에 대한 모든 참조가 깨질 가능성이 높습니다.

네, 흔히 말하듯 이 문제를 해결하는 방법은 정말 많습니다.

내 인생에서 단 한 번만 겪었고, 이제 끝났다는 점이 정말 다행입니다!

:slight_smile:

가능하다면, 가져오기(importer) 측에서 해당 문제를 수정하는 것이 훨씬, 훨씬 쉽습니다. 이미 서비스 공개를 했다면, 그 과정은 길고 고통스러울 것입니다. 이미 가져온 게시글을 수정하는 가져오기 스크립트를 만들어낼 수는 있지만, 이를 수행하는 모델에 대해서는 제가 아는 바가 없습니다.

그래서 아마도 가져오기 전에 정규식을 처리하도록 가져오기 도구를 수정하고, 최대한 인내심을 갖고 진행해야 할 것 같습니다!

답변 주셔서 감사합니다.