6
votes

Utilisez Soundex () Word par mot sur SQL Server

Voici mon problème. Par exemple, j'ai une table produits contenant un champ, nom : xxx

Je suis en train de mettre en œuvre un simple moteur de recherche (SQL Serveur et asp .net, c #) pour une application Web iPhone et j'aimerais utiliser la fonction Soundex () SQL Server fonction.

La chose est, je ne peux pas Utilisez directement Soundex sur le champ nom . (Ce serait sans importance car il y a plusieurs mots dans le nom.) Je voudrais appliquer la fonction Soundex à chaque mot à partir du champ nom , puis voir le cas échéant d'entre eux correspond au mot clé cher cher.

Si quelqu'un a une idée de la façon de faire cela, ce serait génial.


3 commentaires

Combien d'enregistrements sont dans votre table de produits. Une solution de programmation (c'est-à-dire l'analyse du champ Nom dans un champ distinct puis appliquer Soundex à chacun) va fonctionner lentement dans une requête. Vous pourriez faire mieux de changer votre structure de base de données, s'il s'agit d'une possibilité.


Ouais, si votre ensemble de données est important par une comparaison, cela va prendre pour toujours.


Oui, la base de données est grande, c'est ce que je fais actuellement (sur le code C # .NET, à l'aide de REGEXP pour compter le numéro de mots et ajouter de la pertinence par moi-même aux résultats de la recherche) mais c'est très lent. Je regarde dans FreeText en ce moment mais j'en ai eu un problème (voir Stackoverflow.com/Questtions/1923806/... ).


5 Réponses :


5
votes

Plutôt que d'utiliser Soundex, vous serez peut-être mieux en informant la distance de Levenshtein entre les deux chaînes. Voir L'article Wikipedia sur la distance de Levenshtein .

Il y a une implémentation TSQL de l'algorithme de distance de Levenshtein à distance ici .

Partager et profiter.


EDIT 03-MAI-2012

Depuis l'écriture de ma réponse originale, j'ai appris que Oracle inclut la distance de Levenshtein et plusieurs autres fonctions de "chaîne de similarité" dans le package UTL_MATCH, que je pense est une partie standard de la base de données. Documentation ici . Peut-être pas directement lié au poste d'origine (qui était pour SQL Server), mais peut-être utile autant de magasins utilisent plusieurs bases de données.


0 commentaires

4
votes

Avez-vous regardé dans la fonction de recherche en texte intégral dans SQL Server? Je sais que ce n'est pas exactement ce que vous avez demandé. C'est juste que la fonction Soundex () est utilisée pour trouver des noms de sondage similaires (ex: Smith et Smythe son identique). Dans un moteur de recherche, cependant, comment un mot semble être moins important que les mots de recherche eux-mêmes. La recherche en texte intégral vous permet également d'utiliser des synonymes (vous permettant de spécifier certains mots qui signifient la même chose dans le contexte de votre application), et demandez-leur de prendre en compte automatiquement pendant votre recherche.

Regardez ces pages pour plus d'informations sur la recherche de texte complète dans SQL Server:

Introduction à la recherche en texte intégral

contient

contenant de contient

FreeText

FreeTexttable


2 commentaires

J'ai vu FreeText, la chose est que j'ai de gros problèmes l'installer. Lorsque j'ai essayé d'activer le mode FullText, mais je reçois une erreur: utilisez [ASPDotNetStorefront] Go Exec SP_fulltext_Database 'Activer' Go Créer Catalogue CatégorieCatalog Go -> msg 7609, niveau 17, état 100, ligne 1 La recherche de texte intégral n'est pas installée , ou un composant texte intégral ne peut pas être chargé.


Il apparaît que le service FullText n'est pas installé et / ou en cours d'exécution. Si vous exécutez SQL Server Express, le service FullText n'est pas inclus, sauf si vous avez la version qui inclut des services avancés. Here's the link for 2005 (microsoft. com / téléchargements / ... ) Et voici le lien pour 2008 ( Microsoft.com / express / sql / téléchargement ). Si vous avez installé cette version, vérifiez si le service FullText Recherche est en cours d'exécution (Configuration Manager, sous Services).



2
votes

Si vous devez tout faire dans la RDBMS, un UDF serait le meilleur Si c'est une option.

Sinon, vous pouvez utiliser cette technique pour au moins Soundex les quatre premiers mots individuellement en utilisant parsename :

de Comment puis-je diviser une chaîne afin que je puisse accéder à l'élément x? : xxx

Toutefois: l'utilisation de parsename de cette manière est un piratage et une limitation sérieuse est-ce ne fonctionne que pour un max de 4 parties. S'il y a 5 mots ou plus de mots parsename retournera null, vous devez donc vérifier cela avec un conditionnel et dégrader de manière gracieusement.

Voici un exemple simplifié (à nouveau, sans les chèques nuls) < Pré> xxx


0 commentaires

1
votes

Le Soundex peut être un ajustement parfait pour votre purpuse, mais s'il vous plaît rappelez-vous qu'il ne fournit peut-être pas de bons résultats pour rien d'autre que les mots parlés anglais britannique ou américain! Il peut même être utilisé sur des mots phonétiques allemands, mais cela ne fonctionnera pas bien avec quoi que ce soit d'autre.


0 commentaires

1
votes

Vous pouvez essayer de stocker la métaphone de chaque mot concaténé avec des traits d'union. Par exemple, stocké_metaphone code> pourrait contenir quelque chose comme "-aktrf-spls-". Ensuite, construisez une requête comme ceci:

$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 .= ')';


0 commentaires