Faire une recherche par mot clé dans un texte

Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012 - 17 nov. 2005 à 12:37
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 - 7 déc. 2005 à 12:31
Bonjour,



J'ai des docs en
registrés dans ma BDD, j'aimerais faire des récherches par mots clés
sur ces docs enfin de n'en afficher que les docs qui contiennent les
mots clé (comme à la google sauf que les expressions que je pourrais
saisir peuvent être beaucoup plus compliquées que ce qui propose google).



Alors j'aimerais connaitre votre reflexion ...


Et si vous connaissez des fonctions php qui me permettent de faire ce
traitement ou si un code existe dèja qui permet de faire ça ...



Toutes les idées seront les bienvenues..



PS: cette question je l'ai dèja posé mais elle n'était pas dans le bon forum ...

24 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 nov. 2005 à 12:57
Hello,

si tu veux du complexe, renseigne toi sur les index fulltext de mysql.

Sinon, regarde (tjrs en sql) la clause LIKE
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
17 nov. 2005 à 13:02
Plus complexe que Google !!!!!!!!!



Les recherche de google sont déjà pas mals... Tu peux utiliser les parenthèses, les opérateur &,|,!,+, *, -



tu peux spécifier si le mot doit se trouver dans l'url, le meta description, le cache de google, ...



Tu tape "deux^vingt et un",


ça te sort : deux^vingt et un = deux millions quatre-vingt-dix-sept mille cent cinquante-deux




Enorme !!! non ?





Ceci dit... ça ne fera pas de recherche dans ta base...





JE te joint mon expression régulière qui découpe selon les mots (séparé
par espace, point, virgule, ...) mais concerve aussi les expression
exacte (entourée par des guillemets double)





J'espère que cela t'aidera... A+







-----------------------------------------------------------------------------

// la string à découper

$phrase = trim($phrase);



// on décompose la phrase en mots

$m = array();

preg_match_all('@["][^"]+["]|[\S^"]+@', $phrase, &$m);



// l'expression reg sort les ", donc il faut les enlever...

$m = str_replace('"', '', $m[0]);



// pour ne pas chercher douze fois le même mot

$m = array_unique($m);
0
Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012
17 nov. 2005 à 16:47
Merci pour vos réponses,



Effectivement Google fait dèja beucoup des choses mais je ne pense pas
qu'on peut faire une requête du genre "je cherche 'mot1' et
'mot2' qui sont séparés par au plus 3 mots"



Et en plus vous me dites que je ne peut pas l'utilisé pour faire des
recherche dans ma base alors que je pensais qu'on pouvait le faire car
je le voit souvent sur des sites ...



Merci pour l'exp reg je pense que ca va bien m'être utile



Si vous avez d'autres reflexions n'hésitez pas ...
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
17 nov. 2005 à 22:21
"je le voit souvent sur des sites ..."



En effet, mais les recherche google ne se base que sur le contenu
textuel des pages afichées (et depuis peu des fichiers pdf, doc, rft,
...)



Heureusement que google n'a pas acces à votre base de données !! (sécurité)





"je cherche 'mot1' et 'mot2' qui sont séparés par au plus 3 mots"



Ca sent l'usine à gaz ça !!!! Car, pour faire une recherche, il faut
une "double" programmation : une coté PHP (la regexp) puis une autre
qoté BDD (avec le fameux LIKE '%mot%')



Aprés, les bases de données moderne fournissent des fonctions
puissantes pour manipuler les chaînes de caractères. Mais la
programmation SQL n'est pas agréable (de mon point de vue)...



Bonne chance !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 nov. 2005 à 08:18
puis une autre qoté BDD (avec le fameux LIKE '%mot%')



=> ou index fulltext quand on veut vraiment de la puissance (et plus de lenteur...) (mais de la puissance néanmoins... ;-))



Mais la programmation SQL n'est pas agréable (de mon point de vue)

=> dépend quel sql quand même. Mais de toutes façons, autant limiter le travail e la bdd.
0
Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012
18 nov. 2005 à 11:00
Est ce que vous ouriez de la doc sur les indexes fulltext?? ou si vous
pouvez me dire ca corresponds à quoi car je n'ai jamais eu l'ocasion de
l'utilisé ...



Merci encore
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 nov. 2005 à 11:45
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
18 nov. 2005 à 14:34
Note : Bcp de SQL ont des fonctions d'expressions regulières
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 nov. 2005 à 14:51
En plus!



Aucune raison de ne pas nous pondre un moteur de recherche plus puissant que celui de google, du coup ;-)
0
Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012
22 nov. 2005 à 16:05
Bonjour,



Merci beaucoup pour votre aide,



Effectivement les indexes fulltext proposent pas mal de solution pour la recherche dans une BD,



Mais je ne sais pas trop pour la rapidité d'exicution qu'est ce que ça donne!!!



Alors la question que je me pose pour optimiser la recherche est :



A votre avis entre les deux choix cités cidessous le quel serait le plus rapide en exécution:

1)Une requête MySql avec une clause like ou en utilisant les indexes
fulltext enfin de ne selectionner que les enregistrements qui
contiennent les mots clés

2) Une requête MySql qui selectionne tous le contenu de la
colonne sur laquel j'effectue la recherche et après utiliser les
exp reg pour filitrer la selection


Moi je suis plutôt favorable au premier choix, mais je craint que ça soit trop laurd pour la BDD ...



J'attends vos avis.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 nov. 2005 à 16:16
Comme te l'a dit J_G, tu peux utiliser les expressions régulières en
sql. Enfin dans la plupart des sql. Dans mysql, en l'occurence, c'est
le cas.
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
22 nov. 2005 à 16:24
[auteurdetail.aspx?ID=490666 maurimaure] => Vu que tu es allé voir la définition des champs "fulltext"... Tu pourrais me faire un résumé ?



Car je connais pas et j'ai pas trop le temps de me payer une lecture
(superflue) d'une nouvelle doc (même si elle est pas supreflue)...



D'avance merci,

Mais si ça t'embête, ne te casse pas le bill



A+
0
Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012
22 nov. 2005 à 16:50
En fait ça a l'heure assez simple tous simplement lors de la création de ta table t'indique les champs indexés en fulltext:



exemple :

CREATE TABLE articles (

->
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

->
title VARCHAR(200),

->
body TEXT,

->
FULLTEXT (title,body)

->
);

Une fois tes indexes sont crées tu as la possibilité d'utiliser beucoup de fonctions 
qui font à peu près les mêmes recherches que google

exemple :

SELECT * FROM articles

->
WHERE MATCH (title,body) AGAINST ('database');
 



avec cette requête tu cherches les articles dont le titre ou le body contient le mot database ...



J'espére que j'ai pu t'apporter un petit eclaircissement ...



Pour voir un peu plus le mieux c'est les docs c'est pas très long et je le trouve plutôt bien écrit ...



http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
22 nov. 2005 à 17:18
Merci merci merci merci...



Ca à l'air top ce truc !!! pourquoi je suis passé à coté ?



Note : Finalement le gain est coté temps d'exécution de la requète, car
point de vue programmation de la requète, ça reste quasiment aussi
lourd !

Autre note : Cet index n'augmenterait-il pas la taille de la table (en octet) ?



Mais tu m'as motivé à aller lire la doc !



Encore merci...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 nov. 2005 à 17:29
C'est même plus lourd...

Ce qu'on perd en performance, on le gagne en robustesse, en fonctionnalités, et en malléabilité, par contre.

Et si on reste modeste, on s'en sort quand même avec d'excellentes perfs :-)
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
22 nov. 2005 à 17:40
Mais, mais, c'est géniaaaaaaal !!!!




Pourquoi je suis passé à coté de ça... pourquoi... Il va falloir que je me retappe mon moteur de recherche :(





Putain ça faisait longtemps que je n'avais pas appris un truc fou sur ce forum... Ca fait plaisir



Bye et encore merci !
0
cs_pierreprog Messages postés 3 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 7 décembre 2005
26 nov. 2005 à 10:31
J'ai enregistré dans ma base de données des fichiers excel, word et pdf (champ longblob)
Est ce que quelqu'un serait effectué une recherche dans ces documents?
J'aimerai bien utiliser les réponses précédentes mais je n'arrive pas à chercher du texte ne serait ce que ds un pdf. Il est en binaire.
Si quelqu'un sait...
0
Maurimaure Messages postés 20 Date d'inscription mardi 13 novembre 2012 Statut Membre Dernière intervention 13 novembre 2012
30 nov. 2005 à 10:27
->Est ce que quelqu'un serait effectué une recherche dans ces documents?

Normalement oui !!

->J'aimerai bien utiliser les réponses précédentes mais je n'arrive pas à
chercher du texte ne serait ce que ds un pdf. Il est en binaire.

je ne comprend pas pourquoi en binaire?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2005 à 10:55
Hello,

on ne stocke pas des documents entiers dans une bdd dans un champ blob...c'est inutile dans la plupart des cas.
Généralement, on stocke juste l'url vers ces documents. Enfin, tu ne veut peut-être pas les stocker sur le serveur, ok.

Ceci dit, tu ne pourras pas effectuer des recherches sur ces documents, dans ce cas. En tous cas, pas directement dans ta table.

Je te l'ai déjà dit, il me semble, mais généralement, si on veut travailler sur des données provenant d'une autre appli que notre base, et ce directement dans la base, on fait un import de ces données, on ne stocke pas le fichier généré par l'appli dans un champ blob. Parce que ça reste un fichier de ce type, et donc lisible uniquement par le logiciel l'ayant généré!
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
30 nov. 2005 à 14:08
Salut...



Effectivement, tu vas avoir du mal à chercher du texte dans des champs
binaire. Même si ça doit bien être possible quelque part.



Je ne discuterais pas le fait que tu stock ton fichier dans la BDD. Ca peut être utile...



Mais, si tu veux chercher du texte dans ton PDF (par exemple), il va
falloir que tu créasses un autre champs. - Hmm... quel pied ! c'est pas
tous les jour qu'on se paye un subjonctif de l'imparfait !!! Je vais
faire une croix dans mon calendrier, bouges pas. -



Donc je disais un autre champ avec le texte ( (: FULLTEXT :) ) du PDF.
J'ai sur ma bécanne la commande pdftotext inputFile.pdf outputFile.txt
qui se charge de faire la traduction.



C'est du Linux... évidemment !





Bonne chance
0
Rejoignez-nous