2011-03-03 27 views
7

Dadas sus datos almacenados en algún lugar de una base de datos:SQL - buscar base de datos con el operador LIKE

Hello my name is Tom I like dinosaurs to talk about SQL. 
SQL is amazing. I really like SQL. 

queremos poner en práctica una búsqueda en el sitio, lo que permite a los visitantes entrar términos y devuelven los registros relacionados. Un usuario podría buscar:

Dinosaurs 

Y el SQL:

WHERE articleBody LIKE '%Dinosaurs%' 

Copes bien con devolver el conjunto correcto de registros.

¿Cómo podríamos hacer frente sin embargo, si un usuario se equivoca al escribir dinosaurios? IE:

Dinosores 

(Poor sore dino). ¿Cómo podemos buscar permitiendo error en la ortografía? Podemos asociar faltas de ortografía comunes que vemos en la búsqueda con la ortografía correcta, y luego buscar en los términos originales + términos corregidos, pero esto lleva mucho tiempo mantener.

¿Alguna manera programáticamente?

Editar

Aparece SOUNDEX podría ayudar, pero ¿alguien puede darme un ejemplo usando soundex donde entra en el término de búsqueda:

Dinosores wrocks 

devuelve registros en lugar de hacerlo:

WHERE articleBody LIKE '%Dinosaurs%' OR articleBody LIKE '%Wrocks%' 

que devolvería squadoosh?

+0

distancia levenshtein o Soundex –

+1

Dependiendo de la base de datos que está utilizando ... hay funciones "soundex" que se pueden utilizar para obtener una "coincidencia" en palabras ese sonido por igual ... –

+0

No creo que esto se pueda hacer puramente en SQL. Las búsquedas con comodines ya son lentas. Prefiero usar un producto terminado como Apache Lucene o Solr. – Wukerplank

Respuesta

4

Si está utilizando SQL Server, echar un vistazo a SOUNDEX.

Para su ejemplo:

select SOUNDEX('Dinosaurs'), SOUNDEX('Dinosores') 

devuelve valores idénticos (D526).

También puede usar la función DIFFERENCE (en el mismo enlace que soundex) que comparará los niveles de similitud (4 es el más similar, 0 es el menos).

SELECT DIFFERENCE('Dinosaurs', 'Dinosores'); --returns 4 

Editar:

Después de la caza de todo un poco para una opción multi-texto, parece que esto no es tan fácil. Me referiría al enlace en la respuesta de Fuzzt Logic proporcionada por @Neil Knight (¡+1 a eso, para mí!).

This stackoverflow article también detalla las posibles fuentes para las implementaciones de Fuzzy Logic en TSQL.Una vez respondido, también describió la indexación de texto completo como un potencial que es posible que desee investigar.

+0

¿Cómo aplicar esto a una búsqueda de palabras clave múltiples? –

+0

Digamos que entro en mi búsqueda 'dinosores wrock' (que significa roca de los dinosaurios). Tradicionalmente lo haría: DONDE el cuerpo TIENE GUSTO de '% dinosores%' O el cuerpo LIKE 'wrock'. ¿Cómo puedo aplicar soundex en este caso para que registre registros? –

+1

@James, qué tal cuando articleBody se almacena, almacena la versión SOUNDEX, IE "blah blah lol" y "B32 B32 L122". Cuando busca términos, busca LIKE en el soundex. ¿Esto funcionaría bien? –

3

¿Quizás su RDBMS tiene una función SOUNDEX? No mencionaste cuál estuvo involucrado aquí.

+0

Sí, lo hará, SOUNDEX se ve increíble, ¡nunca lo había oído antes! –

0

Respuesta breve, no hay nada integrado en la mayoría de los motores SQL que pueden hacer la corrección basada en el diccionario de "dedos gordos". SoundEx funciona como una herramienta para encontrar palabras que suenan igual y así corregir errores ortográficos fonéticos, pero si el usuario tecleaba "Dinosars" faltando la U final, o realmente la "tocaba con la grasa" e ingresaba "Dinosayrs", SoundEx lo haría no devuelve una coincidencia exacta.

suena como usted quiere algo en el nivel de búsqueda de Google de "Quiso decir _ _?" característica. Puedo decirte que no es tan simple como parece. En un nivel de 10,000 pies, el motor de búsqueda miraría cada una de esas palabras clave y vería si está en un "diccionario" de términos de búsqueda "buenos" conocidos. Si no es así, utiliza un algoritmo muy parecido a una sugerencia de corrector ortográfico para encontrar la palabra del diccionario que es la coincidencia más cercana (requiere la menor cantidad de sustituciones, adiciones, eliminaciones y transposiciones de letras para convertir la palabra dada en la palabra del diccionario). Esto requerirá algún código de procedimiento pesado, ya sea en una función proc o CLR Db almacenada en su base de datos, o en su capa de lógica de negocios.

+0

No quería simular la sofisticación de Google, pero solo tengo una búsqueda en el sitio que podría hacer frente a la ortografía ya que muchos visitantes vienen de todas partes del mundo, ¡pero gracias por la respuesta! –

3

Solo para lanzar una alternativa. Si SSIS es una opción, puede usar la búsqueda difusa.

SSIS Fuzzy Lookup

2

no estoy seguro de si la introducción de una separada "motor de búsqueda" es posible, pero si nos fijamos en productos como el dispositivo de búsqueda de Google o autonomía, estos productos pueden índice de una base de datos SQL y proporcionar más la búsqueda opciones - por ejemplo, el manejo de las faltas de ortografía, así como sinónimos, la búsqueda resultados de ponderación, recomendaciones búsqueda alternativos, etc.

Además, la función de búsqueda de texto completo de SQL Server se pueden configurar para utilizar un diccionario de sinónimos, lo que podría ayudar: http://msdn.microsoft.com/en-us/library/ms142491.aspx

Aquí hay otro SO pregunta de alguien creación de un tesauro para manejar faltas de ortografía comunes: FORMSOF Thesaurus in SQL Server

0

También puede probar el SubString(), para eliminar los 3 primeros caracteres o menos. A continuación se muestra un ejemplo de cómo se puede lograr que

SELECT Fname, Lname 
FROM Table1 ,Table2 
WHERE substr(Table1.Fname, 1,3) || substr(Table1.Lname,1 ,3) = substr(Table2.Fname, 1,3) || substr(Table2.Lname, 1 , 3)) 
ORDER BY Table1.Fname; 
Cuestiones relacionadas