|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 3 ![]() |
Bonjour,
J'ai un petit souci avec l'instruction en sujet. Je ne trouve pas comment faire pour que la requête me retourne les enregistrements du type "abcdef" quand je fais une recherche sur deux mots "abc" "def". Y-a-t'il une possibilité pour ça? J'ai essayé diverses façons, en séparant les chaînes, et utilisant des jokers du type * etc, sans succès. A part concaténer préalablement les chaînes je ne vois pas comment faire, ce qui pose un soucis puisque les mots recherchés sont tapés par un utilisateur et le nombre de combinaisons est exponentiel. De plus je ne sais pas à priori quels mots doivent être concaténés donc la recherche risque de me retourner des résultats non pertinents, alors qu'avec la valeur de retour de Match je pourrais trier lesdits retours. |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 875 ![]() |
salut,
y a pas de solution pour faire ça en fulltext... ce que tu demandes c'est le boulot d'une regexp... comme son nom l'indique, tu indexes des mots par rapport à leur début... après aucune base de donnée mysql ne sera optimisée pour faire ce que tu demandes à grande échelle... faudrait passer par une application en c/c++ genre sphynx oublie une regexp en mysql car son temps d'exécution est juste vite prohibitif éventuellement passer par les fonctions de recherche de sous-chaine... après sans rien de concret dur d'en dire plus... ![]()
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 3 ![]() |
Merci pour ta réponse.
En fait, c'est pour un moteur de recherche sur un site web. L'utilisateur va taper X mots dans le champ de recherche, et je vais chercher dans différents champs d'une BD ce qui correspond le mieux à sa demande. Prenons par exemple, un site marchand qui vend des vidéoprojecteurs. Un client cherche un "Optoma HD 33". Admettons que dans la base de données, la marque soit bien "Optoma" et que le nom du produit soit "HD33". Si je fais un "MATCH (marque, désignation) AGAINST ('Optoma HD 33')" sur la BDD, la requête ne va pas me retourner le produit en question, et là est mon problème. En fait, je voudrais que le MATCH tel que je pensais l'écrire, me retourne tous les enregistrements pour lesquels il y aurait dans la marque ou la désignation au moins un des mots tapés, que cela soit ou non une sous chaîne, avec un indice de correspondance, comme le fait MATCH habituellement. Par exemple, le produit HD33 de marque Optoma dans la BDD serait retourné avec un indice élevé, et le produit HD300 de marque Optoma avec un indice plus faible... et les produits Optoma sans "HD" ni "33" avec un indice encore plus faible. Aujourd'hui pour obtenir ce que je veux je suis obligé de passé par des LIKE et de calculer un indice de pertinence moi-même, je souhaiterais m'en passer et j'espérais pouvoir faire cela avec un simple MATCH sur plusieurs champs. Maintenant tu as peut-être une solution plus intéressante que je n'ai pas imaginée |
|
|
00
|
|
|
#4 |
![]() ![]() |
J'ai du mal à comprendre la raison de ce besoin !
Si je cherche sur Google "PHP MySQL", je ne m'attends pas à ce qu'il concatène les deux mots pour qu'il me renvoie un hypothétique résultat "PHPMySQL" ! Par contre, il me semble que la recherche FULL TEXT devrait sans problème me retourner un score assez élevé avec la chaîne "PHP/MySQL".
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 3 ![]() |
La raison de ce besoin je viens de la donner
Dans une désignation produit, en particulier technologique, tu ne sais jamais s'il y a un espace, un tiret, ou aucun séparateur. J'ai pris un exemple avec le HD33 mais j'aurais pu en prendre beaucoup d'autres. La façon la plus sûre de trouver ce que tu cherches, c'est de séparer les éléments, parce que tu te dis que si c'est concaténé le site va quand même te retourner le bon résultat. Or avec MATCH, si c'est concaténé il ne me retourne rien justement. |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 875 ![]() |
oui, en effet...
tu peux faire des recherches plus customisée en utilisant l'option "in mode boolean" et en indiquant la pertinence de chaque mot via des caratère de contrôle autour des expressions... mais là encore ne rêve pas ça ne te fera jamais ce que fait une regexp, ça ne peut te trouver que des expressions commençant par chaque expression donnée, pas avec elles au milieu ou en fin... si tu veux ce que fait google ou tout service de référencement utilise le mais le problème c'est que tu n'auras jamais de contrôle réel sur ce que tu recherches... autrement soit tu développes en c/c++ ou java un utilitaire qui indexe les mots et les soumets à une regexp ou d'une formule de distance entre 2 expression... et la c'est pas le plus simple qui t'attend... soit tu as des solutions tiers partie à mysql... la recherche comme avec des regexp en fulltext n'existe pas de base en mysql... soit tu peux essayer de voir avec des sgbd autre (postgre, sql server ou oracle) mais c'est une problématique qui n'est jamais traitée comme ça dans aucun d'eux, je pense... enfin de ce que je me souvient de mes cours de fac en oracle... à confirmer et voir en fonction des couts éventuels de licence...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#7 | |||
![]() ![]() |
Citation:
Bref... Je ne suis pas habitué à la recherche FULL TEXT mais il me semble que si je cherche "HD" et que la colonne contient "HD33", la ligne devrait être retournée avec un assez bon score nom ? De même si je cherche "33" ? Alors si tu peux exploser les mots de la recherche et additionner les résultats des MATCH AGAINST sur chaque mot de la recherche, tu devrais avoir une pertinence assez bonne en résultat sur une recherche "HD 33" pour obtenir "HD33". Grosso modo : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
Copyright © 2000-2012 - www.developpez.com