Faire une recherche par mot clé dans un texte

Signaler
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012
-
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
-
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

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
Hello,

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

Sinon, regarde (tjrs en sql) la clause LIKE
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
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);
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012

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 ...
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
"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 !
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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.
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012

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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
Note : Bcp de SQL ont des fonctions d'expressions regulières
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
En plus!



Aucune raison de ne pas nous pondre un moteur de recherche plus puissant que celui de google, du coup ;-)
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012

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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
[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+
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012

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
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
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...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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 :-)
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
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 !
Messages postés
3
Date d'inscription
jeudi 18 mars 2004
Statut
Membre
Dernière intervention
7 décembre 2005

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...
Messages postés
21
Date d'inscription
mardi 13 novembre 2012
Statut
Membre
Dernière intervention
13 novembre 2012

->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?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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é!
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
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