Recherche dans une bdd [TITRE MODERE CAR PEU EXPLICITE!]

milkasoprano Messages postés 239 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 1 juillet 2007 - 22 mars 2006 à 22:25
milkasoprano Messages postés 239 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 1 juillet 2007 - 25 mars 2006 à 12:24
Bonjour,
Voila cette apres midi jai cherché une solution a mon probleme concernant le fait de faire une recherche a partir dune base de donnée et un champ precis. or je voudrai par exemple depuis un formulaire php taper une phrase...
et comme tous le monde sait, une phrase et composé de mot ! c 'est meme mots ont les appellera mots clefs !

Quand on lance la requete php, on constate que les mots clefs que j'ai taper ( imaginons )

Aujourdhui je vais à la piscine et je prend le bus

renverra a un resultat...
des phrases programmé renvoi a une reponse .. voila le but du script.
Donc imaginons que je tape la phrase que j'ai mis en haut dans mon formulaire.
Mon script va chercher tous les mots comportant les mots que jai tapé et va afficher un resultat.

Mais moi je voudrai restreindre tous ca ! et dire ceci :
tous les mots qui sont tapés sont verifiés dans la base et renvoyé au plus proches au mots pres !

Je sous entend bien plus proche dans le sens que .

Aujourdhui = 1 mots
je = 1 mot
vais = 1 mot
à = 1 mot

Jusqu'a ce qui ramene a un resultat unique.

Aujourd'hui je vais à la piscine. ( si la phrase est la meme dans la base de donnée alors le resultat s'effectuera ) mais il y a une faille
imaginons que je mette :

demain je vais a la piscine. le resultat se rapprochera vers aujourdhui je vais a la piscine

mais si il y a deux fois le mot piscine dans la base de donnée, il va mafficher le resultat le plus proche. et c'est pas ce que je veux.. genre par exemple: hier jai vu un gars ce noyer dans la piscine (ben oui le mot piscine figure dans la base )

en gros je veux regroupé tous les mots qui sont tapé et si la majorité d'entre eux sont presentes (mot clefs) ( c a dire le maximum ! alors on affiche ce resultat maximum! et pas l'autre.) c'est a dire le je, vais, a, la, piscine 5mots clefs


Tous les mots tapés sont verifiés...

Le probleme avec mon script c'est que il ignore pas le fait que dans un enregistrement par exemple :

Je vais a la piscine
1 1 1 1 1
Je vais a la mer
1 1 1 1 0

le " je" le "vais" le "a" le "la"

il l'ai garde pour lui, je veux dire il l'ai ignore pas.
pourtant jai bien dis dans mon formulaire. je vais a la piscine
donc il doit prendre le maximum de mot clefs pour retourner a un resultat unique.
piscine est present dans mon formulaire !!!!! il doit ignorer l'enregistrement ou il y a la phrase je vais a la mer..

voici mon script..
j'espere sincerement quelquun pourra maider parce que je deviens dingue ! jessai detre le plus precis en vous expliquant mon probleme mais c'est pas facile ...

jespere que vous allez arrivé a me comprendre..
--------------------------
SI VOUS VOULEZ TESTER EN LOCAL CEST POSSIBLE

table ---
CREER UN CHAMP : id (int) un autre champ question (text) et un champ resultat (text) et essayer ! je vous jure vous comprendrez mieux ;)
et inserez plusieurs phrases avec les memes mots ou les memes pronoms etc..

---
<form name ="form1" method="post" action="boul.php">
Posez votre question :
&nbsp;

</form>


<? include("config.php");
if(empty($_POST["submit"])){
}
else{
$array_ask = explode(' ',$_POST['question']);
$first = true;
$req = '';
foreach ($array_ask as $key => $value)
{
if ($first)
{
$first = false;
$req .= "`question` LIKE '%".$value."%'";
}
else
{
$req .= " OR `question` LIKE '%".$value."%'";
}


}
$req_results = mysql_query("SELECT * FROM `voyance` WHERE ".$req."");



if ( @mysql_num_rows($req_results) == 0)
{
echo 'aucun r&eacute;sultat';
}
elseif(@mysql_num_rows($req_results)>1){
echo 'Désolé mais je ne comprend pas votre question, pouvez vous etre plus precis';
}
elseif(@mysql_num_rows($req_results)==1){
$rest = mysql_fetch_array($req_results);


echo $rest['resultat'];
}
else{
echo "erreur";
}







}
?>

3 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 mars 2006 à 07:21
Hello,

tourne toi vers les index fulltext (regarde la doc mysql), tu ne t'en sortiras pas avec des LIKE...
Tu peux aussi viser Levenshtein, et le principe que j'utilise dans mes codes 'Phonex' et 'Soundex2' ou 'Recherche des villes et codes postaux français'
0
milkasoprano Messages postés 239 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 1 juillet 2007
23 mars 2006 à 10:17
Merci malalam pour ta reponse ;) Japprecie toujours quand tu me reponds ;)
jai vu ton message a 8h ce matin et la on est 10h13. je suis tjs au point de depart. je fais que d'essayer les methodes que tu utilises généralement mais la ca dépasse carrement mon niveau... donc j'abandonne. je peux plus chercher, ca me deprime.
je vais essayer de tenter le index fulltext mais c meme pas garantie que jy arriverai.

J'ai vu ta source au fait sur le soundex2 mais sérieusement ca dépasse mon niveau dinteligence. je me content quand je fais un script de faire des choses relativement connu mais la pour faire une recherche via une base de donnée avec le maximum de mot clef qui retourne au resultat le plus proche ! ca me depasse. j'ai tous essayé mais j'en deviens a bout...

Merci encore pour tous ;)
Bonne journée a toi...

Je fermerai ce mess en fin d'apres midi si je trouve...
+++
0
milkasoprano Messages postés 239 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 1 juillet 2007
25 mars 2006 à 12:24
Bon j'y arrive toujours pas mais j'ai fais ceci :


$question = $_POST["question"];
$query = "SELECT * FROM faq WHERE MATCH (question) AGAINST ('$question' IN BOOLEAN MODE)";
$result = mysql_query($query);

Alors dans mon champ mysql il est indiqué ceci :

QUESTION RESULTAT
est ce que je vais avoir des enfants plus tard --> OUI BEAUCOUP BEAUCOUP
Est ce que je vais avoir mon baccalaureat --> Ouais mention bac + 20

Quand je tape dans mon formulaire

Est ce que je vais avoir mon baccalaureat
Il me retourne a OUI BEAUCOUP BEAUCOUP

POURTANT la requete ce fait ! mais au dirait qu'il ne prend pas en compte le mot :
mon baccalaureat

Quand je tape ensuite dans le formulaire mon baccalaureat , la requete me repond : Ouais mention bac + 20

FRANCHEMENT j'y comprend plus rien !
il faudrai que ca marche en mettant les conditions suivantes : en fonction du nombre de mots dans la ligne, du nombre de mots uniques dans cette ligne, du nombre total de mots dans la liste, et du nombre de documents (lignes) qui contiennent un mot en particulier. ( genre baccalaureat ! present dans cette phrase )
0
Rejoignez-nous