Nombre d'occurences => toujours besoin d'aide - SQL/NoSQL - Programmation
Marsh Posté le 26-01-2007 à 23:53:27
je sais pas exactement sous MySQL.
sur les autres SGBD, c'est généralement un rang que tu reçois, c'est à dire un indice de pertinence.
genre :
Citation : le chien de gaston court après un autre chien |
Citation : le chien de gaston croque un os. puis un autre chien vient lui piquer son os, avant de filer. le malheureux chien se met alors à sa poursuite |
=> ma seconde phrase contient plus de chiens que la première. par contre, leur densité est plus grande, donc la réponse semble plus pertinante. il aura donc un rang suppérieur.
si mysql se contente de compter, tu auras respectivement 2 et 3.
ensuite, ce rang est confondu pour tous les mots.
sâchant que la densité de l'ensemble des mots impacte aussi le range.
genre tu chercher "chien" et "os". si t'as une ligne qui ne parle que de chien, elle aura un rang plus faible que si t'as une ligne qui mentionne une seule fois les deux mots. (d'où l'intérêt d'avoir un rang et non un nombre d'occurencs)
Marsh Posté le 27-01-2007 à 08:43:53
ça oui j'avais compris mais c'est pour créer la base que je pédale :
voici un exemple sur Nexen.net :
La recherche en texte intégral est effectuée par la fonction MATCH() .
CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body));
INSERT INTO articles VALUES (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'), (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'), (NULL,'Optimising MySQL','In this tutorial we will show ...'), (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'), (NULL,'MySQL Security', 'When configured properly, MySQL ...');
Création de table puis insertion de données.
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
Requete.
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
Résultat.
La base de données sur laquelle je fais tourner mon moteur de recherche commence à pédaler
(voir ici => ) http://erwann.conan.free.fr/index.php
les enregistrements indexés sont ceux des blogs pour lesquels j'ai extrait le texte dans un champ 'body' et nous savons tous que les bloggueurs sont bavards ...
Donc dans ma table j'ai :
le champ 'body' en TEXT
le champ 'url' en VARCHAR(255)
le champ 'match' en VARCHAR (255) pour le TITLE du site
le champ 'description' en VARCHAR (255)
le champ 'motcle' en VARCHAR(255) qui contient tous les mots clés sans virgule
le champ 'valeur' en SMALLINT qui m'indique le nombre de fois que le site a été visité
J'ai voulu tenter une requete sur le champ 'body' => trop complexe
donc je voudrais :
Dans un premier temps recréer cette table avec l'exemple de nexen.net
Dans un deuxième temps pouvoir lancer des requetes sur le champ 'body'
Voila mon problème actuel.
A savoir que je monte jusqu'à 8 visiteurs connectés en meme temps et que donc la BDD est très sollicitée
MERCI DE VOTRE PRECIEUSE AIDE
Marsh Posté le 26-01-2007 à 22:27:13
Bonjour
Voila une ligne de code
$requete = " SELECT * FROM `base` WHERE (`match` LIKE '%$mot[1]%' OR `description` LIKE '%$mot[1]%' OR `motcle` LIKE '%$mot[1]%') ORDER BY `valeur` DESC LIMIT 0 , 20 ";
etc etc etc
or je voudrais faire un UNION qui me retourne deux types de résultats les uns après les autres :
select .... where condition1 UNION select ..... where condition2
exemple: on recherche une phrase
je voudrais retourner les solutions LIKE '%PHRASE%' et à la suite les solutions LIKE '%mot1%' puis LIKE '%mot2%' etc etc
PRIMO :
Est-ce faisable ?
SECUNDO :
pouvez vous me filer un bout de code SVP ?
Merci
VOICI UNE REPONSE :
union = sql
ta requette = sql
Ta question n'a aucun rapport avec le php.
Ton message n'a d'ailleur rien à voir avec du php (même si le texte de ta requette est modifié par du php)
Conclusion : encore une question posé dans la mauvaise section.
En attendant, si tu cherches à obtenir un résultat plus vite en mettant des union à la place des and et or, alors non ca ne marchera pas : tu risques de n'obtenir ton résultat qu'aprés un temps 2 à 3 fois plus long qu'avec ta requette actuelle.
Par contre, ce que tu peux faire avec Mysql, c'est mettre la colonne en fulltext et faire des recherches de type fulltext. (voir doc de mysql pour plus de détail) Ca ira plus vite et en plus ca te permettra de trier les résultats en fonction du nombre d'occurence des mots recherché.
QUESTION (DE MOI)
admettons donc que j'ai un champ fulltext de environ 1500 caractères de long (ouf si si)
je recherche "chien" et "toilette" et "marseille"
le nombre d'occurence ... comment ça marche ???
Encore une fois merci à tous
Message édité par erwan83 le 27-01-2007 à 08:45:08
---------------
http://www.ypikay.com