2011-10-29 11 views
6

Tengo un cliente que pregunta si su búsqueda, que busca nombres de compañías que podrían buscarse en varios formatos dependiendo de la entrada del usuario, como la compañía almacenada en la base de datos es AJR Kelly Ltd, por ejemplo, si es un usuario busca "AJR Kelly" se encuentra, usando;MySQL LIKE% string% no es lo suficientemente indulgente. ¿Algo más que pueda usar?

<cfif pctermsCount gt 0> 
AND (LOWER(p.name) LIKE '%#pcTerms#%') 
</cfif> 

Si en su búsqueda de "Kelly", la compañía se encuentra, pero si que la búsqueda de una versión rota de la cadena como "Un J Kelly" o "AJ Kelly" no ha encontrado.

¿Hay algo que pueda hacer para hacerlo un poco más indulgente?

Gracias.

Respuesta

8

Si está utilizando MyISAM, puede usar la indexación de texto completo. See this tutorial

Si está utilizando un motor de almacenamiento diferente, puede utilizar un motor de texto completo de terceros como sphinx, que puede actuar como un storage engine for mysql o un servidor independiente que se puede consultar.

Con MySQL texto completo indexar una búsqueda sobre A J Kelly coincidiría AJ Kelly (sin confundir las cosas, pero A, J y AJ se ignoraría, ya que son demasiado corto por defecto y que coincidiría con el Kelly.) Por lo general Texto completo es mucho más indulgente (y generalmente más rápido que LIKE '% string%') porque permite coincidencias parciales que luego pueden clasificarse según la relevancia.

También puede usar SOUNDEX para hacer las búsquedas más indulgentes al indexar los equivalentes fonéticos de las palabras y buscarlos aplicando SOUNDEX en los términos de búsqueda y luego usarlos para buscar en el índice. Con soundex mary, marie y marry coincidirán, por ejemplo.

+0

Estamos usando MyISAM. Consideré FullText así que probé para asegurarme de poder habilitar eso en la mesa, puede hacerlo.Todavía no lo he probado, porque significaría un poco de toquetear la interfaz de usuario, pero le mostraré algunos ejemplos al cliente en PHPMyAdmin, pero tengo la sensación FullText podría ser un poco tolerante por su gusto. Gracias por tu respuesta. El texto completo parece ser la mejor solución si no puede vivir con el problema. –

+0

No debería necesitar ningún toque en la interfaz de usuario. Puede tomar la misma cadena de búsqueda y cambiar el DONDE a algo como 'donde MATCH (indexcol) contra ('AJ Kelly' en modo booleano) ORDER BY MATCH (indexcol) contra ('AJ Kelly' en modo booleano) DESC' –

+0

Yeah , lo siento, no estaba claro. Por "interfaz de usuario" me refiero al código de la página web, hay una gran cantidad de consultas basadas en muchas cosas provenientes de muchos lugares, es bastante complejo, por lo que es más fácil probar si le gustan los resultados del texto completo mostrándolo en PHPMyAdmin que hacer muchos cambios en el código de back-end para probarlo. Lo siento, pero gracias por publicar ese fragmento de consulta, me salvó más tiempo. :RE –

1

Tricky, supongo que un método simple sería eliminar espacios en blanco en la búsqueda de términos de bases de datos, por lo que se utiliza AJRKelly en lugar de AJR Kelly. Luego use espacios en blanco como un separador para términos de búsqueda individuales. De esa forma AJ Kelly buscaría A, J y Kelly por separado. AJ Kelly buscaría a AJ y Kelly por separado. Coinciden en el término de la base de datos de AJRKelly whitespace removed.

+0

Esto realmente solo cubre un caso de uso limitado, solo permite coincidencias exactas, y sería difícil de implementar de manera eficiente. O bien habría dos columnas para cada columna para buscar (una con, una sin espacios) o el espacio en blanco sería eliminado antes de realizar el similar (que se volverá muy caro) –

2

Puede crear una nueva columna y convertirla en la versión de búsqueda del nombre quitando el espacio en blanco, luego establecer el tipo de datos de columna como FULLTEXT (solo funcionará con MyISAM). Es posible que desee buscar en Lucene/SOLR también. SOLR proporciona una cantidad de tokenizadores que funcionan muy bien en este tipo de situación. La curva de aprendizaje es bastante alta, pero vale la pena a largo plazo.

4

Si está ejecutando ColdFusion, tiene acceso a la indexación de texto completo de CF utilizando Verity o Solr/Lucene. Cualquiera de estos debería ofrecerle una buena capacidad de "combinación difusa" para cadenas.

Tener que usar tablas MyISAM es una píldora amarga solo para la indexación de texto completo. Pierde mucha tranquilidad y cosas como restricciones de clave externa.

Cuestiones relacionadas