[SQL] Recherche fulltext : accent et pertinence

15 réponses
AuteurMessage

PyRoFlo |
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 25/06/2005 à 16:40

Salut

Je recode un moteur de recherche interne à un site, fini les LIKE etc...

J'utilise désormais http://dev.mysql.com/doc/mysql/fr/fulltext-boolean...Ouvrir dans une nouvelle fenetre .

Ca fonctionne très bien et j'en suis content mais j'ai quand même deux questions

- comment gérer la recherche avec des mots accentués ? Actuellement, "école" ne sera pas trouvé dans "mon école".

- comment ordonner les résultats par pertinence décroissante ?
En fulltext simple c'est en natif, pas lorsqu'on utilise le mode booléen...

Dernière question un peu différente : est-il possible de récupérer le nombre de résultats d'une requête type...

SELECT champ FROM table WHERE MATCH(colonne) AGAINST(chaine) LIMIT 5

...sans tenir compte de la clause LIMIT ?
En gros, comment éviter de faire une seconde requête ?

Voilà voilà

Merci d'avance !

(Message édité le 25-06-2005 à 16h45 par PyRoFlo)

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

aKennedy |
Membre

Photo de aKennedy

Inscrit le : 09/05/2005

# Le 25/06/2005 à 18:12

Je n'ai jamais eu de problèmes d'accents avec Fulltext (et pourtant il parait qu'à Bruxelles on en a un gros).

Francis HeaulmeOuvrir dans une nouvelle fenetre , JFKOuvrir dans une nouvelle fenetre et autres joyeusetés.

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 25/06/2005 à 18:49



Je vais refaire des tests mais il me semble bien que...

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

LePhasme | Guillaume
Membre

Photo de LePhasme

Inscrit le : 09/05/2005

# Le 25/06/2005 à 20:53

Tres interessant ca ... j'en été resté au like lol

Paris Apartments RentalsOuvrir dans une nouvelle fenetre Avertisseur Autonome de FumeeOuvrir dans une nouvelle fenetre ViadeoOuvrir dans une nouvelle fenetre

erwinol | Erwin
Membre

Photo de erwinol

Inscrit le : 09/05/2005

# Le 26/06/2005 à 11:32

Si tu mets une clause LIMIT, tu ne peux pas récupérer le nombre d'enregistrements si celui-çi est supérieur à la limite.

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 26/06/2005 à 16:19

Ok merci erwinol

Pas d'idées pour les deux premières questions ?

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 26/06/2005 à 17:58

PyRoFlo a dit :

- comment gérer la recherche avec des mots accentués ? Actuellement, "école" ne sera pas trouvé dans "mon école".

étonnant, de mémoire mysql ne fait pas différence entre une chaine accentuée et une non accentuée. Peut être as tu un encodage de caractère particulier ?
PyRoFlo a dit :
- comment ordonner les résultats par pertinence décroissante ?
En fulltext simple c'est en natif, pas lorsqu'on utilise le mode booléen...

Un truc du type :

SELECT *, MATCH (nom,titre) AGAINST ('webmasterclub') as score FROM base where MATCH (nom,titre) AGAINST ('webmasterclub') order by score asc limit 200

http://dev.mysql.com/doc/mysql/fr/fulltext-search....Ouvrir dans une nouvelle fenetre


PyRoFlo a dit :
Dernière question un peu différente : est-il possible de récupérer le nombre de résultats d'une requête type......sans tenir compte de la clause LIMIT ?

Non, tu dois effectuer la requete sans le limit et compter les enregistrements, ou plus proprement lancer la même avec un count(champ) sur la clé unique. Donc deux requetes. Si quelqu'un a une autre méthode je suis aussi intéressé ;)

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 26/06/2005 à 22:44

Merci pour ta réponse Zalex14

- première question : résolue, mes accents étaient codés en Html....erreur d'inattention

- deuxième question : résolue, j'avais bien lu ce passage mais je n'avais pas testé car je pensais que cette technique fonctionnait seulement pour une recherche fulltext simple

- dernière question : c'est bien ce que je pensais, donc j'utiliserai encore une seconde requête...c'est bête !

Merci à tous

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

Inscrit le : 04/05/2005

# Le 26/06/2005 à 23:02

Tu peux toujours faire ta requête totale et incrémenter un compteur à chaque fois que tu affiches une réponse. Quand ton compteur passe 10, par exemple, tu fais ce que tu as à faire (inclure le footer par exemple) et tu termine par un exit()... Bon c'est pas très propre, c'est vrai mais faut peut être mieux faire ça qu'une requête supplémentaire... ?

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 26/06/2005 à 23:30

C'est une idée effectivement, mais je pense qu'il est préférable d'utiliser deux "petites" requêtes (une sur un champ indexé, l'autre avec une clause LIMIT) qu'une seule "grosse" qui sélectionnera tous les enregistrements.

Imagine sur une table d'un million d'entrées

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 27/06/2005 à 00:36

Suite à une question en privée, voilà ma requête :

SELECT champ,
MATCH(colonne) AGAINST("chaine" IN BOOLEAN MODE) as score
FROM table
WHERE MATCH(colonne) AGAINST("chaine" IN BOOLEAN MODE)
ORDER BY score DESC

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

MultiNetWorks | Damien
Membre

Photo de MultiNetWorks

Inscrit le : 13/05/2005

# Le 27/06/2005 à 00:41

Merci pour ta rquêtte mais après avoir effectué quelques test sur ma bdd, tous les scores renvoyés sont égal à 1 chez moi, donc aucun classement ne peut etre fait en fonction du score, normal ?

Damien...

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 27/06/2005 à 00:51

Heu chez moi ça fonctionne parfaitement

Effectivement, lorsque j'affiche le "score", ils sont tous égaux à 1 sauf parfois le premier résultat (donc le plus pertinent) qui vaut 2.

Pourtant les enregistrements sont bien ordonnés par pertinence décroissante.

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

Inscrit le : 04/05/2005

# Le 27/06/2005 à 00:53

PyRoFlo a dit :
C'est une idée effectivement, mais je pense qu'il est préférable d'utiliser deux "petites" requêtes (une sur un champ indexé, l'autre avec une clause LIMIT) qu'une seule "grosse" qui sélectionnera tous les enregistrements.

Imagine sur une table d'un million d'entrées

C'est pour ça que je disais que c'était pas propre

MultiNetWorks | Damien
Membre

Photo de MultiNetWorks

Inscrit le : 13/05/2005

# Le 27/06/2005 à 01:09

@ ouai, juste !
C'est souvent 1 tout de même comme score d'où mon incompréhension, mais merci comme même !

Damien...

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 27/06/2005 à 01:24

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 23/11/2024 18:55:10 | Généré en 10.2ms | Contacts | Mentions légales |