Je désire implémenter un moteur de recherche basé sur des mot-clé entrés par
des utilisateurs. Mes premiers essais ont été faits avec la fonction
CONTAINS mais est limitative pour les pluriels (si "affaire" est dans la BD
et que je cherche "affaires", le résultat ne sort pas). On m'a suggéré
d'utiliser les fonctions SOUNDEX ou DIFFERENCE mais ces fonctions réagissent
mal en français. J'ai alors trouvé la fonction SOUNDEX2 mais j'ai de la
difficulté à l'utiliser dans une clause WHERE.
Pourriez-vous me dire quel est la meilleure stratégie pour résoudre mon
problème?
Ci-joint, un exemple de ma requête actuelle.
Merci
Marc T.
------------------------------------------------------------------------------------------
SELECT docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement,
min(docsMots.ValeurCorrespondance)as ValeurCorrespondance
FROM Portail.dbo.ListeQualite_Documents docs WITH(NOLOCK)
JOIN Portail.dbo.ListeQualite_Documents docs2 WITH(NOLOCK) ON
docs2.NoDocument = docs.NoDocument
LEFT JOIN Portail.dbo.ListeQualite_DocumentsMotsCles docsMots WITH(NOLOCK)
ON docs2.DocumentID = docsMots.DocumentID
LEFT JOIN Portail.dbo.ListeQualite_MotsCles mots WITH(NOLOCK) ON
docsMots.NoMotCle = mots.NoMotCle
LEFT JOIN Portail.dbo.ListeProjet_Langue langue WITH(NOLOCK) ON
docs.LangueID = langue.LangueID
WHERE (CONTAINS(mots.Texte, '"dessin atelier"')
OR CONTAINS(docs2.Titre, '"dessin atelier"')
OR CONTAINS(docs2.NoDocument, '"dessin atelier" ') )
GROUP BY docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement
ORDER BY ValeurCorrespondance, docs.NoDocument, langue.TitreLangu
Pour mieux comprendre les mécanismes de l'indexation textuelle, lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/indextextuelle/
A +
Frédéric BROUARD - SQLpro - MVP SQL Server Expert SQL, SGBDR, modélisation de données SQL et SGBDR http://sqlpro.developpez.com/ Formations, conseils, audit, modélisation, optimisation, tuning : www.datasapiens.com
"Marc T" a écrit :
Bonjour à tous,
Je désire implémenter un moteur de recherche basé sur des mot-clé entrés par des utilisateurs. Mes premiers essais ont été faits avec la fonction CONTAINS mais est limitative pour les pluriels (si "affaire" est dans la BD et que je cherche "affaires", le résultat ne sort pas). On m'a suggéré d'utiliser les fonctions SOUNDEX ou DIFFERENCE mais ces fonctions réagissent mal en français. J'ai alors trouvé la fonction SOUNDEX2 mais j'ai de la difficulté à l'utiliser dans une clause WHERE.
Pourriez-vous me dire quel est la meilleure stratégie pour résoudre mon problème?
Ci-joint, un exemple de ma requête actuelle.
Merci
Marc T.
------------------------------------------------------------------------------------------ SELECT docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement, min(docsMots.ValeurCorrespondance)as ValeurCorrespondance FROM Portail.dbo.ListeQualite_Documents docs WITH(NOLOCK) JOIN Portail.dbo.ListeQualite_Documents docs2 WITH(NOLOCK) ON docs2.NoDocument = docs.NoDocument LEFT JOIN Portail.dbo.ListeQualite_DocumentsMotsCles docsMots WITH(NOLOCK) ON docs2.DocumentID = docsMots.DocumentID LEFT JOIN Portail.dbo.ListeQualite_MotsCles mots WITH(NOLOCK) ON docsMots.NoMotCle = mots.NoMotCle LEFT JOIN Portail.dbo.ListeProjet_Langue langue WITH(NOLOCK) ON docs.LangueID = langue.LangueID WHERE (CONTAINS(mots.Texte, '"dessin atelier"') OR CONTAINS(docs2.Titre, '"dessin atelier"') OR CONTAINS(docs2.NoDocument, '"dessin atelier" ') )
GROUP BY docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement ORDER BY ValeurCorrespondance, docs.NoDocument, langue.TitreLangu
Utilisez une forme fléchie du mot avec l'option FORMOF / INFLECTIONNAL.
Pour mieux comprendre les mécanismes de l'indexation textuelle, lisez
l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/indextextuelle/
A +
Frédéric BROUARD - SQLpro - MVP SQL Server
Expert SQL, SGBDR, modélisation de données
SQL et SGBDR http://sqlpro.developpez.com/
Formations, conseils, audit, modélisation,
optimisation, tuning : www.datasapiens.com
"Marc T" a écrit :
Bonjour à tous,
Je désire implémenter un moteur de recherche basé sur des mot-clé entrés par
des utilisateurs. Mes premiers essais ont été faits avec la fonction
CONTAINS mais est limitative pour les pluriels (si "affaire" est dans la BD
et que je cherche "affaires", le résultat ne sort pas). On m'a suggéré
d'utiliser les fonctions SOUNDEX ou DIFFERENCE mais ces fonctions réagissent
mal en français. J'ai alors trouvé la fonction SOUNDEX2 mais j'ai de la
difficulté à l'utiliser dans une clause WHERE.
Pourriez-vous me dire quel est la meilleure stratégie pour résoudre mon
problème?
Ci-joint, un exemple de ma requête actuelle.
Merci
Marc T.
------------------------------------------------------------------------------------------
SELECT docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement,
min(docsMots.ValeurCorrespondance)as ValeurCorrespondance
FROM Portail.dbo.ListeQualite_Documents docs WITH(NOLOCK)
JOIN Portail.dbo.ListeQualite_Documents docs2 WITH(NOLOCK) ON
docs2.NoDocument = docs.NoDocument
LEFT JOIN Portail.dbo.ListeQualite_DocumentsMotsCles docsMots WITH(NOLOCK)
ON docs2.DocumentID = docsMots.DocumentID
LEFT JOIN Portail.dbo.ListeQualite_MotsCles mots WITH(NOLOCK) ON
docsMots.NoMotCle = mots.NoMotCle
LEFT JOIN Portail.dbo.ListeProjet_Langue langue WITH(NOLOCK) ON
docs.LangueID = langue.LangueID
WHERE (CONTAINS(mots.Texte, '"dessin atelier"')
OR CONTAINS(docs2.Titre, '"dessin atelier"')
OR CONTAINS(docs2.NoDocument, '"dessin atelier" ') )
GROUP BY docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement
ORDER BY ValeurCorrespondance, docs.NoDocument, langue.TitreLangu
Pour mieux comprendre les mécanismes de l'indexation textuelle, lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/indextextuelle/
A +
Frédéric BROUARD - SQLpro - MVP SQL Server Expert SQL, SGBDR, modélisation de données SQL et SGBDR http://sqlpro.developpez.com/ Formations, conseils, audit, modélisation, optimisation, tuning : www.datasapiens.com
"Marc T" a écrit :
Bonjour à tous,
Je désire implémenter un moteur de recherche basé sur des mot-clé entrés par des utilisateurs. Mes premiers essais ont été faits avec la fonction CONTAINS mais est limitative pour les pluriels (si "affaire" est dans la BD et que je cherche "affaires", le résultat ne sort pas). On m'a suggéré d'utiliser les fonctions SOUNDEX ou DIFFERENCE mais ces fonctions réagissent mal en français. J'ai alors trouvé la fonction SOUNDEX2 mais j'ai de la difficulté à l'utiliser dans une clause WHERE.
Pourriez-vous me dire quel est la meilleure stratégie pour résoudre mon problème?
Ci-joint, un exemple de ma requête actuelle.
Merci
Marc T.
------------------------------------------------------------------------------------------ SELECT docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement, min(docsMots.ValeurCorrespondance)as ValeurCorrespondance FROM Portail.dbo.ListeQualite_Documents docs WITH(NOLOCK) JOIN Portail.dbo.ListeQualite_Documents docs2 WITH(NOLOCK) ON docs2.NoDocument = docs.NoDocument LEFT JOIN Portail.dbo.ListeQualite_DocumentsMotsCles docsMots WITH(NOLOCK) ON docs2.DocumentID = docsMots.DocumentID LEFT JOIN Portail.dbo.ListeQualite_MotsCles mots WITH(NOLOCK) ON docsMots.NoMotCle = mots.NoMotCle LEFT JOIN Portail.dbo.ListeProjet_Langue langue WITH(NOLOCK) ON docs.LangueID = langue.LangueID WHERE (CONTAINS(mots.Texte, '"dessin atelier"') OR CONTAINS(docs2.Titre, '"dessin atelier"') OR CONTAINS(docs2.NoDocument, '"dessin atelier" ') )
GROUP BY docs.NoDocument, docs.Titre, langue.TitreLangue, docs.Emplacement ORDER BY ValeurCorrespondance, docs.NoDocument, langue.TitreLangu