Voici mon problème. Par exemple, j'ai une table produits em> contenant un champ, nom em>: 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 La chose est, je ne peux pas Utilisez directement Si quelqu'un a une idée de la façon de faire cela, ce serait génial. P> p> Soundex () code> SQL Server fonction. P> Soundex code> sur le champ nom em>. (Ce serait sans importance car il y a plusieurs mots dans le nom.) Je voudrais appliquer la fonction Soundex code> à chaque mot à partir du champ nom em>, puis voir le cas échéant d'entre eux correspond au mot clé cher cher. P>
5 Réponses :
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 . P>
Il y a une implémentation TSQL de l'algorithme de distance de Levenshtein à distance ici . P>
Partager et profiter. P>
EDIT 03-MAI-2012 P>
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. P>
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. P>
Regardez ces pages pour plus d'informations sur la recherche de texte complète dans SQL Server: P>
Introduction à la recherche en texte intégral p>
contient P>
FreeText P>
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).
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 : p>
de Comment puis-je diviser une chaîne afin que je puisse accéder à l'élément x? : p> 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. P> Voici un exemple simplifié (à nouveau, sans les chèques nuls) P> < Pré> xxx pré> p>
Le Soundex code> 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. P>
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 .= ')';
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/... ).