2011-07-06 11 views
7

Estamos almacenando bloques de contenido HTML en MySQL (es texto formateado creado en CKeditor. Ckeidor agrega estilos CSS en línea para formatear el texto). Estamos almacenando la base de datos en una columna llamada "page_content"Ignorar caracteres HTML al buscar contenido HTML almacenado PHP/MySQL?

Queremos una función de búsqueda que permita a los usuarios buscar el texto (solo). Sin embargo, no queremos que la búsqueda devuelva caracteres HTML, que es lo que está sucediendo en este momento. Por ejemplo, si buscamos "fuente" no queremos que los resultados de la búsqueda devuelvan páginas con los estilos HTML <font>

¿Hay alguna manera de ignorar los caracteres HTML/CSS al buscar contenido HTML almacenado desde MySQL?

Respuesta

4

¿Usted ha considerado la creación de una tabla separada para estas búsquedas? MySQL's full text search solo funciona con tablas MyISAM, por lo que probablemente no desee mezclar esa búsqueda de texto completo con datos importantes (a menos que, por supuesto, tenga un extraño disgusto por las claves foráneas y la integridad referencial).

El enfoque que he usado en el pasado es básicamente el siguiente:

  • establecer una mesa separada con una estructura simple (id, texto_búsqueda).
    • El id coincide con el id de lo que está buscando.
    • El search_text es todo (texto del cuerpo, título, nombre del autor, ...) que desea buscar en una sola gota de texto.
  • Agregue full text indexing en la tabla de búsqueda.
  • Actualice su proceso de actualización de base de datos para construir la cadena search_text apropiada como texto sin formato; aquí es donde puedes quitar el HTML y posiblemente aplicar algunas otras asignaciones (como expandir cosas como "A +" a algo que la búsqueda de texto completo encontrará).
  • Al realizar una búsqueda, aplica las mismas asignaciones que aplica a los datos de búsqueda y luego busca las coincidencias en la tabla de búsqueda.

Esto resuelve el problema de HTML, le permite buscar más que el contenido HTML fácilmente, y le permite afinar los resultados de la búsqueda mediante la ponderación de los diferentes componentes del texto de búsqueda a través de la repetición (por ejemplo, si desea que las etiquetas sean más importantes que el texto del cuerpo, solo agrega las etiquetas dos o tres veces al construir el search_text).

Tendrá que procesar su texto para eliminar o ignorar el HTML. Este enfoque te permite hacerlo solo una vez en lugar de hacerlo en cada búsqueda.

+0

Lo único que le falta a esta solución es poder buscar en un campo específico, como resultado de concatenar todo el texto para una sola entidad. Por ejemplo, no podría encontrar todas las entidades con 'foo' en el título, ya que las entidades con 'foo' en el cuerpo también coincidirían. –

+0

@Chris: Pero puede solucionarlo con columnas adicionales si es necesario. –

+0

@Chris, no podemos eliminar el HTML. Se trata de contenido formateado utilizando Ckeditor (inclinar estilos CSS) – user635800

Cuestiones relacionadas