¿Cuál es la forma más rápida de reemplazar cadenas con múltiples expresiones regulares en 1 millón de publicaciones?

Después de una importación desde vBulletin, necesito corregir muchas cosas en los mensajes importados.

Necesito modificar, reemplazar o eliminar muchas etiquetas BBcode antiguas.

Estaba revisando esto: Replace a string in all posts

Definitivamente no quiero cometer errores, ya que tengo 1,6 millones de publicaciones.

  1. ¿Existe alguna forma de dirigirse a una sola publicación específica para realizar pruebas antes de reemplazar las cadenas en todas las publicaciones?
    He creado una publicación de “prueba” en mi foro con un montón de etiquetas BB en varios contextos.

  2. ¿Cuánto tiempo tomaría reemplazar una cadena en más de 1 millón de publicaciones?
    Si toma mucho tiempo, ¿hay una forma más rápida? ¿Quizás editando directamente los textos en la base de datos?

  3. ¿Existe alguna forma de realizar múltiples reemplazos a la vez (por ejemplo, agregar saltos de línea antes y después de las etiquetas [quote], reemplazar [b] e [i] por ** y *, eliminar [color] e [indent], etc.)?

edit: ¿aplicar estas modificaciones al contenido crudo de las publicaciones mediante Rails y luego rehacer todas las publicaciones sería la solución?

1 me gusta

También estoy buscando la misma solución.

Hola @Canapin

Para tu información, tras nuestra migración de 1 millón de publicaciones desde vB3 a Discourse hace unos seis meses:

Cuando migramos desde vB, realizamos toda esta limpieza de datos y refactorización de etiquetas bbcode con mucho código Ruby personalizado en el script de migración.

Descubrimos que esto funcionó mejor para nosotros; limpiar todo ejecutando muchas expresiones REGEX Ruby gsub en las publicaciones de vB antes de insertarlas en la base de datos de Discourse.

De lo contrario, tendrás que ejecutar muchas consultas de PostgreSQL nuevamente contra las publicaciones sin procesar de Discourse y recocinar las publicaciones.

Después de pruebas extensas, decidimos hacer todo el preprocesamiento durante la migración (y no después de la migración). Descubrimos que esta era la forma más “rápida” de lograr una migración perfecta.

Espero que esto ayude.

1 me gusta

¿Sabes si hay una manera de volver a importar solo los posts sin afectar los datos de Discourse ya importados, especialmente aquellos vinculados a los IDs de los posts (usuarios, temas, archivos adjuntos, enlaces permanentes, etc.)?

La importación es tan larga que, si olvidé algo y debo volver a importar TODO de nuevo, tomará días otra vez.

Cuando el script importaba los posts, creaba aproximadamente 50,000 posts de Discourse por hora. ¿Por qué tarda tanto más tiempo el rebake?

Hola @Canapin

Entiendo tu dolor. Después de nuestra migración original, escribimos mucho código Ruby personalizado para limpiar más de una década de código copiado y pegado desde todos los rincones del planeta; sin mencionar todos los mojibake y conjuntos de caracteres extraños; y sin mencionar los diversos bbcode anidados que requerían mucho trabajo en Ruby para limpiarse adecuadamente durante la migración.

No fue trivial y tomó mucho tiempo (y numerosos intentos de migración); pero somos/éramos principalmente un foro de programación, así que si tu foro es mayormente solo texto (y no código), debería ser más sencillo.

Nuestro equipo tuvo que escribir muchas expresiones regulares (REGEX) “algo complejas para escapar de esto y aquello”; porque convertir todo ese bbcode anidado heredado a markdown no es trivial cuando la gente publicó tanto bbcode anidado a lo largo de los años. También eliminamos mucho bbcode que consideramos que añadía poco valor años después de su publicación.

Para responder a tu pregunta original de arriba:

Sí, puedes simplemente comentar los métodos que deseas omitir en el script de migración.

De hecho, reescribimos gran parte de los métodos de migración, pero fueron un punto de partida muy bueno y muy útiles, considerando que la migración desde vB3 estaba y sigue sin soporte.

1 me gusta

Lo sé, pero si simplemente inicio el script de migración, omitirá las publicaciones existentes.

Si elimino todas mis publicaciones importadas de Discourse antes de reiniciar la migración, supongo que volver a importarlas asignará un ID diferente (ID de publicación de Discourse) al de la migración anterior, y es probable que todas las referencias a estas publicaciones queden rotas.

1 me gusta

Sí, hay muchas formas de “pelar este gato”, como se dice.

Estoy muy feliz de que solo tuviera que hacerlo una vez en mi vida y ¡ya está hecho!

:slight_smile:

1 me gusta

Si es posible, es mucho, mucho más fácil que el importador solucione esos problemas. Si ya has publicado, será largo y doloroso. Podrías idear un script de importación que modifique las publicaciones ya importadas, pero no conozco ningún modelo para hacerlo.

1 me gusta

Así que supongo que modificaré el importador para que ejecute mis expresiones regulares antes de la importación y seré lo más paciente posible. ¡Gracias por sus respuestas!

2 Me gusta

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