Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1164 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Search in fulltext

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Search in fulltext

n°2036555
greeeg
Posté le 17-11-2010 à 11:03:43  profilanswer
 

Hello,  
 
J'ai une petite question MySQL, au sujet de recherches dans un champ TEXT. J'ai une table (dont malheureusement je ne peux modifier la structure) qui contient un champ texte ; nommons-le "pe". Celui-ci possède un index de type fulltext.
 
Typiquement ce champ contient : 1,2,3
Une requête avec un "FIND_IN_SET", pour rechercher toutes les entrées contenant "2" p.ex. fonctionne parfaitement bien, cependant c'est très très lent (visiblement ça n'utilise pas l'index). Exemple :

Code :
  1. SELECT * FROM mytable WHERE FIND_IN_SET('2', pe);


 
L'idée serait alors d'utiliser un match against :

Code :
  1. SELECT * FROM mytable WHERE MATCH (pe) AGAINST ('+"2"+' IN BOOLEAN MODE);


 
Or les inconvénients de cette méthode sont :

  • si on recherche dans 1,2,3 : pas de résultats, or dans 2,3,4 ou 3,4,2 ça fonctionne ;
  • si on recherche dans 1,222,3 : il trouve aussi un résultat.


Mes questions : comment limiter la recherche à un mot entier, dans une liste séparée par virgule avec match/against ? Y a-t-il aussi rapide, mais avec une autre fonction (sachant toujours que je ne peux pas modifier la structure de la table) ?
Merci beaucoup pour votre aide.


---------------
Un être en tant qu'être ne pourrait-il pas être autre qu'il n'est s'il n'explique pas lui-même son être ?
mood
Publicité
Posté le 17-11-2010 à 11:03:43  profilanswer
 

n°2036597
flo850
moi je
Posté le 17-11-2010 à 14:00:45  profilanswer
 

sans modifier la structure de la table, ça va etre difficile de faire mieux
A défaut de modifier cette structure,est ce que tu peux faire une table a côté qui explose le champ pe ? le tout alimenté par des trigger en cas de modification/insertion/suppression sur la table parent

 

pour la seconde possibilité, peut etre que tu peux le corriger comme ça :  

Code :
  1. SELECT * FROM mytable WHERE
  2. pe LIKE '2,%' // 2 est en premier
  3. OR pe LIKE '%,2,%' // 2 est  au milieu
  4. OR pe LIKE  '%,2'  //2 est  à la fin
  5. OR pe = 2  // 2 est tout seul


mais c'est sale

Message cité 1 fois
Message édité par flo850 le 17-11-2010 à 14:04:20
n°2036678
greeeg
Posté le 17-11-2010 à 16:25:57  profilanswer
 

flo850 a écrit :

sans modifier la structure de la table, ça va etre difficile de faire mieux  
A défaut de modifier cette structure,est ce que tu peux faire une table a côté qui explose le champ pe ? le tout alimenté par des trigger en cas de modification/insertion/suppression sur la table parent
 
pour la seconde possibilité, peut etre que tu peux le corriger comme ça :  

Code :
  1. SELECT * FROM mytable WHERE
  2. pe LIKE '2,%' // 2 est en premier
  3. OR pe LIKE '%,2,%' // 2 est  au milieu
  4. OR pe LIKE  '%,2'  //2 est  à la fin
  5. OR pe = 2  // 2 est tout seul


mais c'est sale


 
Effectivement, c'est pas très joli. Il faut que l'insiste lourdement pour arriver à faire changer cette structure et créer une table de relation... (le champ "pe" contenant des id...)


---------------
Un être en tant qu'être ne pourrait-il pas être autre qu'il n'est s'il n'explique pas lui-même son être ?
n°2036687
esox_ch
Posté le 17-11-2010 à 16:34:26  profilanswer
 

J'ai pas benché mais je dirais aussi qu'une requête avec LIKE "%...%" ne va pas être d'une rapidité exemplaire, parce que là aussi pas d'indexes utilisés :(


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2036698
flo850
moi je
Posté le 17-11-2010 à 16:55:20  profilanswer
 

c'est super couteux, mais je ne sais pas ce que ça donne par rapport à find_in_set
 
like 'bidule%' utilise les index, mais aps le reste

n°2036865
esox_ch
Posté le 18-11-2010 à 12:13:40  profilanswer
 

Sans avoir benché, j'aurais tendance à dire qu'une fonction implantée dans SQL (et donc très probablement, implémentée de manière optimale) sera de toutes façons plus rapide que de tenter de l'émuler par une suite de commandes (surtout que 2 d'entre elles font un scan table)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2036904
greeeg
Posté le 18-11-2010 à 14:43:17  profilanswer
 

flo850 a écrit :

c'est super couteux, mais je ne sais pas ce que ça donne par rapport à find_in_set
 
like 'bidule%' utilise les index, mais aps le reste


 
C'est kifkif :)


---------------
Un être en tant qu'être ne pourrait-il pas être autre qu'il n'est s'il n'explique pas lui-même son être ?
n°2039930
E-Nyar
I ain't no nice guy after all
Posté le 03-12-2010 à 17:27:36  profilanswer
 

avec les expressions régulières ça irait pas un poil plus vite (à écrire et à traiter par la BDD) :
 
mysql> SELECT "hfr" REGEXP "^r.*";              
mysql> SELECT "forum.hardware.fr\nforum" REGEXP "^r.*";          


---------------
Don't fuck me, I'm anonymous.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Search in fulltext

 

Sujets relatifs
Mise en page HTML, Google search box.[Résolu] [Powershell] [LDAP] un Search sur une sous-OU ?
CATIA V5 - Automatiser la fonction searchComment faire une recherche en fulltext sur une view
Indexer / Search : moteur de recherche[eclipse] Plug-in pour une fonction search plus rapide ?
Probleme avec FULLTEXTlive search api web service avec java
Soap google search api 
Plus de sujets relatifs à : Search in fulltext


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)