Moteur de recherche avancé

Résolu
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
-
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
-
Bonjour,

Pour mon site je réalise un moteur de recherche interne.
Jusqu'a la version 3 de celui ci tout allait bien, c'était un moteur de recherche pluto sympa mais sans plus.
Pour la nouvelle version je souhaite optimiser celui ci.
Pour cela je m'inspire donc de Google.

Tout d'abord j'ai réussit sans problème a afficher dans la description des résultats du texte contenant le mot clé recherché.
La description est coupé a différent endroit et récupère des morceaux de phrases contenant le mot clé recherché.

Voici le problème qui s'oppose maintenant :
J'aimerai que la méthode de tri soit plus élaboré.
A savoir que j'aimerai trié mes résultats par nombre d'occurence trouvé.
Exemple :
Deux résultats : "papa a une voiture" / "maman a une voite rouge et une voiture verte"
On notera que le timestamp du premier enregistrement sera plus petit que le 2e.

Si je suis ma méthode de tri :
SELECT * FROM table WHERE motcle LIKE '%voiture%' ORDER BY datetime DESC LIMIT 0 , 20
"papa a une voiture" sera renvoyé en premier.

Hors j'aimerai que les résultats qui comporte le plus d'occurence du mot clé soit affiché en premier.
Est ce possible avec une requète Sql ?

Il ne suffirai pas de trié par ordre croissant.
D'autre part je ne peux pas me permettre non plus de parcourir tout les résultats, de compter le nombre d'occurence trouvé pour chacun d'eux et de re-parcourir un tableau pour enfin afficher le résultat final car le nombre de résultat peut facilement atteindre les 1 000 et ceci sera trié par tranche de 20.

En cherchant un peu partout sur le site et sur le net, j'ai découvert GROUP BY mais je n'ai pas vraiment bien compris ce a quoi il servait, est ce que cela pourai m'être utile ici ?

En vous remerciant d'avance, je me tiens a disposition de toute questions permetant de comprendre un peu mieux mon problème.

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusive IE)
v.4 en cours : http://www.blog.flash-nouvelle.com/

7 réponses

Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Je pense avoir enfin trouver solution a mon problème.
Merci pour votre aide.

A titre informationel pour ceux qui passeront ici :
http://www.elliptic.fr/doc/mysql/fulltext-search.html
http://omiossec.developpez.com/mysql/fulltext/etudes/
Ces deux liens devraient vous servir.

Merci encore.

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusiv
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
Salut

Regarde du coté de la recherche fulltext
http://omiossec.developpez.com/mysql/fulltext/etudes/

Bon courage
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Bonjour,

Tout d'abord merci pour ta réponse.
J'ai été voir le lien que tu m'a fournit mais je ne vois pas en quoi cela poura m'aider.

Peut être ai-je mal expliqué mon problème.
Je vais essayer de résumé ce que j'aimerai faire :

J'aimerai trié les résultats que je cherche par nombre d'ocurence du mot clé trouvé.
Exemple : dans ma table voici ce qu'un champs comporte :
-Ce jeux est super !
-Les jeux de socièté sont très aprécié des enfants, ils jouent a ces jeux sans cesse.
-Le jeu de loie est un très vieu jeu mais toujours très connu. On peut y jouer a plusieur.

Imaginons que je recherche le mot "jeu".
J'aimerai que les résultats soit retourné comme ceci :
-Le jeu de loie est un très vieu jeu mais toujours très connu. On peut y jouer a plusieur.
-Les jeux de socièté sont très aprécié des enfants, ils jouent a ces jeux sans cesse.
-Ce jeux est super !

A savoir celon le nombre d'ocurence trouvé dans l'enregistrement. Et cela si possible directement via une requète sql.
En vous remerciant d'avance.

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusive IE)
v.4 en approche : pour vous renseignez : http://www.blog.flash-nouvelle.com/
Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
12
/****************************************************************************/
-- Compte le nombre d'occurences d'une sous chaine dans une chaine
/****************************************************************************/
CREATE FUNCTION dbo.FN_COUNTSTR (@STR VARCHAR(8000), @PATTERN VARCHAR(8000))
RETURNSINTEGER
AS
BEGIN

DECLARE @I INTEGER

-- cas trivial données en entrée NULL
IF @STR ISNULLOR @PATTERN ISNULL
BEGIN
   SET @I = NULL
   RETURN @I
END

-- cas trivial données en entrée vide
IF @STR ='' OR @PATTERN =''
BEGIN
   SET @I = 0
   RETURN @I
END

-- cas général

DECLARE @STR2 VARCHAR(8000)

SET @STR2 = @STR
SET @I = 0

WHILE PATINDEX('%'+@PATTERN+'%', @STR2) > 0
BEGIN
   SET @I = @I +1
   IF LEN(@STR2) > PATINDEX('%'+@PATTERN+'%', @STR2) + LEN(@PATTERN)
      SET @STR2 = SUBSTRING(@STR2, PATINDEX('%'+@PATTERN+'%', @STR2)
      + LEN(@PATTERN), LEN(@STR2) - PATINDEX('%'+@PATTERN+'%', @STR2)
      -  LEN(@PATTERN)+1)
   ELSE
      SET @STR2 = ''
END

RETURN @I

END
GO



BasicInstinct
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Bonjour,

N'ayant pas extrèmement de conaissance en sql je ne puis vraiment comprendre ce code.
J'ai toutefois trouver quelque chose d'intéréssant sur le lien que m'a fournit nhervagault :
SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort') AS  cpt
FROM example_fulltext
WHEREMATCH (texte, commentaire, titre) AGAINST ('mort')
ORDER BY cpt DESC
Mais je n'ai pas résussit a faire de même pour mon cas. Après avoir créer la tableau comme indiqué au début de la page (voir le lien formuler deux messages plus haut) lorsque l'on éxécute cette requète un tri est effectué et semble être trié par nombre d'ocurence trouver.
J'ai donc fait de même pour moi, créer une clé (bien que je ne comprenne pas vraiment leur utilité) et appliquer cette requète en la modifiant celon mes besoins.
La requète ne retourne pas d'erreur mais aucun résultat n'est affiché alors que des enregistrements contiennent bien le mot clé que je recherche.
Je n'ai, je pense, commis aucune erreur de recherche, a savoir que je recherche dans les bon champs.

En vous remerciant encore pour votre réponse.

Ps : Cette requète sql sera traiter avec php par la suite.

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusiv
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Bonjour

J'ai encore essayer de trouver d'ou pouvait venir c enouveua problème mais sans succès.
Tout d'abord voici la table sql que j'ai créer :
CREATE TABLE `test_m` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `txt` text character set latin1 collate latin1_general_ci,
  `autre` text character set latin1 collate latin1_general_ci,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `recherche` (`txt`,`autre`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;




 



--
-- Contenu de la table `test_m`
--





 



INSERT INTO `test_m` VALUES (1, 'jeu
jeu, blacknightfsijfshdufhusdhfusdhfuishfds, le jeu est pluto bien je trouve.\r\njeu m''entend tu ?', 'blaknight ame les jeux vidéo, particulièrement les jeux de stratégie.');
INSERT INTO `test_m` VALUES (2, 'jouons a un jeu qui permettra de jouer a qu veut jouer a un jeu !', 'je ne sais pas se qu''est un jeu, mais je jous souvent aux jeux vidéo.');



Ensuite voici la requète que j'éxécute :
SELECT txt, MATCH (txt, autre) AGAINST ('jeu') AS  cpt
FROM test_m
WHERE MATCH (txt, autre) AGAINST ('jeu')
ORDER BY cpt DESC

Mais là, aucun résultat n'est retouné, alors qu'avec la table créer grâce a cette url :
http://omiossec.developpez.com/mysql/fulltext/etudes/
Cela marche très bien. J'ai peut être mal créer ma table mais j'en doute.

D'ou pourai donc venir le problème ?

En vous remerciant de votre aide par avance

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusive IE)
v.4 en préparation : http://www.blog.flash-nouvelle.com/
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
J'ai également essayer de modifier la requète sql pour retiré le tri :
SELECT txt, MATCH (txt, autre) AGAINST ('jeu') AS  cpt
FROM test_m
ORDER BY cpt DESC
Par contre la, cela me retourne bien un enregistrement et cela me permet donc de voir qu'il ne trouve jamais l'ocurence "jeu" dans mes enregistrements se qui est totalement faux puisqu'on peut voir a multiple reprise ce mot.

J'imagine que c'est un problème de structure.. mais je ne comprend pas lequel.

Merci pour votre aide futur.

Blacknight
http://flash-nouvelle.no-ip.org/ v.3 disponible (Exclusiv