OVH Cloud OVH Cloud

Requetes de recherche

1 réponse
Avatar
Marc T
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

1 réponse

Avatar
SQLpro
Utilisez une forme fléchie du mot avec l'option FORMOF / INFLECTIONNAL.

...
CONTAINS(mots.Texte, ' FORMSOF (INFLECTIONAL, affaire) ')

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