2009-03-05 10 views
9

OK Tengo una base de datos MySQL que se ve algo como esto¿Está el texto completo buscando la respuesta?

ID - un int y el ID único del registrado

Título - El nombre del elemento

Descripción - La descripción de artículos

Quiero buscar el título y la descripción de las palabras clave, actualmente estoy usando.

SELECT * FROM 'tema' en el título como Key%%

Y esto funciona, y como no hay mucho en la base de datos, como sin embargo la búsqueda de “esta clave” no encuentra “esta esa clave "Quiero mejorar el motor de búsqueda del sitio, e incluso puedo agregarle algún tipo de sistema de clasificación (pero eso está muy lejos).

Por lo tanto, me enteré de algo llamado "Búsqueda de texto completo" que es (hasta donde puedo decir) un elemento básico del diseño de la base de datos, pero como soy Newby no sé nada al respecto. ...

1) ¿Crees que sería útil?

Y un Questron adicional ...

2) ¿Qué puedo leer sobre el diseño de bases de datos de diseño/motor de búsqueda que me va a apuntar en la dirección correcta.

Si es de relevancia el sitio está escrito actualmente en stright PHP (es decir sin un marco) (thro la idea de convertirlo en Ruby on Rails ha pasado por la cabeza)

actualización

Gracias todo, iré para la búsqueda de texto completo. Y para cualquiera que encuentre esto más tarde, encontré un buen tutorial en búsqueda de texto completo también.

Respuesta

9

El problema con la búsqueda del tipo '% keyword%' es que no hay forma de buscar eficientemente en una tabla normal, incluso si crea un índice en esa columna. Piensa en cómo verías esa cadena en la guía telefónica. En realidad, no hay forma de optimizarlo, tienes que escanear todo el directorio telefónico, y eso es lo que hace MySQL, un escaneo completo de la tabla.

Si cambia esa búsqueda a 'palabra clave%' y utiliza un índice, puede obtener una búsqueda muy rápida. Aunque parece que esto no es lo que quieres.

Así que con esto en mente, he utilizado la indexación de texto completo/buscar un poco, y aquí están algunos pros y contras:

Pros

  • muy rápidos
  • devuelve resultados ordenados por relevancia (de forma predeterminada, aunque puede usar cualquier clasificación)
  • Se pueden usar palabras de detención.

Contras

  • sólo funciona con tablas MyISAM
  • palabras que son demasiado cortos son ignorados (mínimo son 4 letras)
  • requiere diferentes SQL en la cláusula donde, por lo que se necesita modificar consultas existentes.
  • no coincide con cadenas parciales (por ejemplo, 'palabra' no coincide 'palabra clave', sólo 'palabra')

Here is some good documentation on full-text searching.

Otra opción es utilizar un sistema de búsqueda como Sphinx. Puede ser extremadamente rápido y flexible. Está optimizado para búsquedas y se integra bien con MySQL.

+0

Gracias, me refiero a usar algo como Sphinx, pero para ser honesto, a menos que me lleve una gran cantidad de tiempo, prefiero construirlo de esa manera. Entiendo cómo funciona. –

+0

nos estamos acercando a la implementación de sphinx en una de nuestras aplicaciones. hacemos una gran búsqueda en una tonelada de datos. utilizamos la búsqueda de texto completo por un tiempo, pero necesitamos movernos a innodb para las transacciones. Pero, el texto completo fue fácil de implementar y realmente rápido. – jonstjohn

1

También puede considerar Zend_Lucene. Es un poco más fácil de integrar que Sphinx, porque es puro PHP.

+0

no lo recomendaría porque es muy lento – deresh

2

Supongo que el texto completo de MySQL es suficiente para sus necesidades, pero vale la pena señalar que el soporte integrado no se escala muy bien. Para documentos de tamaño promedio, comienza a quedar inutilizable para tamaños de tabla tan pequeños como unos cientos de miles de filas. Si crees que esto podría convertirse en un problema aún más, probablemente deberías considerar a Sphinx. Se está convirtiendo en el estándar de facto para los usuarios de MYSQL, aunque personalmente prefiero implementar mi propia solución usando java lucene. :)

Además, me gustaría mencionar que la búsqueda de texto completo es fundamentalmente diferente del estándar LIKE '% keyword%' - search. A diferencia de la búsqueda LIKE, la indexación de texto completo le permite buscar varias palabras clave que no tienen que aparecer una junto a la otra. Los motores de búsqueda estándar, como google, son los motores de búsqueda de texto completo, por ejemplo.

Cuestiones relacionadas