2009-12-17 23 views
6

Aquí está mi problema. Por ejemplo, tengo una mesa los productos que contiene un campo, Nombre:Use SOUNDEX() palabra por palabra en SQL Server

Products 
ID | Name | .. 
1 | "USB Key 10Go" 
2 | "Intel computer" 
3 | "12 inches laptop computer" 
... 

Actualmente estoy poniendo en práctica un simple motor de búsqueda (SQL Server y ASP .NET, C#) para un iPhone aplicación Web y me gustaría utilizar la función SOUNDEX() SQL Server.

El problema es que no puedo usar directamente SOUNDEX en el campo Nombre. (Esto sería irrelevante ya que hay varias palabras en el nombre.) Me gustaría aplicar la función SOUNDEX a cada palabra del campo Nombre, y luego ver si alguno de ellos coincide con la palabra clave investigada.

Si alguien tiene alguna pista de cómo hacer esto, sería increíble.

+0

el número de registros en la tabla de productos. Una solución de programación (es decir, analizar el campo de nombre en un campo separado y luego aplicar soundex a cada uno) se ejecutará lentamente en una consulta. Puede que sea mejor cambiar la estructura de su base de datos, si es posible. – Sparky

+0

, sí, si su conjunto de datos es grande en comparación, tardará una eternidad en ejecutarse. – DForck42

+0

Si la base de datos es grande, eso es lo que estoy haciendo actualmente (en el código C# .NET, utilizando expresiones regulares para contar el número de palabras y añadir relevancia a solas a los resultados de la búsqueda), pero es muy lento. Estoy buscando FREETEXT en este momento, pero tengo algún problema con él (ver http://stackoverflow.com/questions/1923806/how-to-turn-on-the-fulltext-mode-on-ms-sql-2005) . – Charles

Respuesta

4

¿Ha analizado la función de búsqueda de texto completo en SQL Server? Sé que esto no es exactamente lo que pediste. Es solo que la función SOUNDEX() se usa para encontrar nombres de SOUNDING similares (EX: SMITH y SMYTHE suenan igual). En un motor de búsqueda, sin embargo, cómo suena una palabra es menos importante que las palabras de búsqueda en sí mismas. La búsqueda de texto completo también le permite usar sinónimos (lo que le permite especificar ciertas palabras que significan lo mismo dentro del contexto de su aplicación), y hacer que se consideren automáticamente durante su búsqueda.

mirada a estas páginas para obtener más información acerca de la búsqueda de texto completo en SQL Server:

Introduction to Full-Text Search

CONTAINS

CONTAINSTABLE

FREETEXT

FREETEXTTABLE

+0

He visto FREETEXT, la cosa es que tengo grandes problemas para instalarlo. Cuando traté de activar el modo de texto completo, pero me da un error: USO [AspDotNetStorefront] GO EXEC sp_fulltext_database 'permitir' GO CREATE FULLTEXT CATALOG searchcatalog GO -> Msg 7609, nivel 17 , State 100, Line 1 La búsqueda de texto completo no está instalada, o no se puede cargar un componente de texto completo. – Charles

+0

Parece que el servicio FULLTEXT no está instalado y/o en ejecución. Si está ejecutando SQL Server Express, el servicio FULLTEXT no está incluido a menos que tenga la versión que incluye servicios avanzados. Aquí está el enlace para 2005 (http://www.microsoft.com/downloads/details.aspx?familyid=4C6BA9FD-319A-4887-BC75-3B02B5E48A40&displaylang=en) y aquí está el enlace para 2008 (http: //www.microsoft.com/express/sql/download/). Si ha instalado esa versión, a continuación, comprobar si el servicio de búsqueda de texto completo está en marcha (administrador de configuración, en Servicios). –

5

En lugar de utilizar Soundex, es posible que sea mejor calcular la distancia Levenshtein entre las dos cadenas. Ver the Wikipedia article on Levenshtein distance.

Hay una implementación de TSQL del algoritmo de distancia de Levenshtein here.

Comparte y disfruta.


EDITAR 03-mayo-2012

Desde escribir mi respuesta original He aprendido que Oracle incluye la distancia Levenshtein y varias otras funciones "similitud de cadenas" en el paquete UTL_MATCH, que creo que es una parte estándar de la base de datos. Documentación here. Tal vez no directamente relacionado con la publicación original (que era para SQL Server) pero tal vez sea útil ya que muchas tiendas usan múltiples bases de datos.

1

Si tiene que hacerlo todo en el RDBMS, un UDF sería lo mejor si es una opción.

De lo contrario, podría utilizar esta técnica para al menos soundex las primeras cuatro palabras de forma individual utilizando PARSENAME:

De How do I split a string so I can access item x?:

PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1) --return computer 
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2) --return laptop 
... 

Sin embargo: el uso de ParseName de esta manera es un corte y una seria La limitación es que solo funciona para un máximo de 4 partes. Si hay 5 o más palabras, PARSENAME devolverá NULL, por lo que debe verificarlo con un condicional y degradarse correctamente.

Aquí está un ejemplo simplificado (de nuevo, sin los controles NULL)

SELECT * 
FROM Products 
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4)) 
    OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3)) 
    OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2)) 
    OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1)) 
1

El SOUNDEX puede ser un ajuste perfecto para su purpuse, pero por favor recuerde que no puede proporcionar buenos resultados para cualquier otra cosa que el británico o palabras habladas en inglés americano! Incluso se puede usar en palabras fonéticas alemanas, pero no funcionará bien con CUALQUIER COSA.

1

usted podría intentar almacenar el metaphone de cada palabra concatenada con guiones. El campo EG stored_metaphone podría contener algo como '-AKTRF-SPLS-'. A continuación, crear una consulta como esta:

$where = '('; 
$search_sql = array(); 
$search_terms = explode(' ',$search); 
foreach ($search_terms as $term) { 
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'"; 
} 
$where .= implode(' OR ',$search_sql); 
$where .= ')'; 

NB esto es sólo la parte WHERE de la consulta.

Por lo que yo sé metaphone sólo funciona con Inglés. El sql anterior funciona bastante bien en una serie de sitios.

Cuestiones relacionadas