IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

comportement bizarre fulltext


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Par défaut comportement bizarre fulltext
    Bonjour à tous,


    je n'arrive pas à comprendre pourquoi une certaine recherche en mode Fulltext ne fonctionne pas...

    Soit une table 'enonce' :

    id - INT / PK
    enotxt0 - TEXT avec index FullText

    Soit un enregistrement de cette table :

    id = 1
    enotxt0 = "Par cause de soi, j’entends ce dont l’essence enveloppe l’existence, autrement dit, ce dont la nature ne peut se concevoir qu’existante."


    J'arrive à trouver cet enregistrement si je cherche le mot "enveloppe" ou "concevoir", et, semble-t-il, tout autre mot SAUF le mot "cause" (et aucun autre enregistrement comportant ce mot non plus).
    Idem si je cherche "caus*".

    "caus*" me ramène les enregistrements qui comportent "causalité" par exemple, mais pas ceux qui comportent seulement "cause".

    Une idée de ce qui pourrait expliquer un si étrange comportement ?
    Un problème d'encodage ? Le mot "cause" aurait une signification particulière en SQL ??

    La requête de recherche ressemble dans chaque cas à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *, MATCH(enotxt0) AGAINST ("+cause" IN BOOLEAN MODE) AS score FROM enonces LEFT OUTER JOIN types ON enonces.typid = types.typid WHERE MATCH(enotxt0) AGAINST ("+cause" IN BOOLEAN MODE)
    Merci d'avance pour votre aide.

    JG.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je pensais que la cause de l'absence de cause pouvait être la longueur du mot mais si j'en crois la doc MySQL, la taille mini de mot est de 4 lettres.
    A moins que la liste des mots à ignorer soit paramétrable ou la longueur mini du mot ?
    MySQL utilise un filtre très simple pour séparer le texte en mots. Un "mot" est n'importe quelle chaîne de caractères constituée de lettres, chiffres, ‘'’ et ‘_’. Tout "mot" présent dans la liste des mots à ignorés ou qui est trop court (3 caractères ou moins) est ignoré.

    • Un mot trop court est ignoré. La taille minimale pour un mot dans les recherches est de 4 lettres.
    • Les mots de la liste sont ignorés. Un mot banni est par exemple ``the'' ou ``some'', ``un'' or ``les'' en fran¸ais, qui sont considérés comme trop communs pour avoir une valeur intrinsèque. Il y a une liste de mots bannis en anglais par défaut.


    La taille minimale des mots et la liste de mots à ignorer sont décrites dans la section Section 12.6.4, « Paramétrage précis de la recherche en text intégral de MySQL ».
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Par défaut
    Merci pour cette piste.

    La longueur n'est pas en cause : d'autres recherches marchent très bien avec des mots de 4 lettres et même 2 ou 3 lettres + joker.

    Donc, je suppose que le mot "cause" doit faire partie des mots anglais interdits.
    Par contre, je ne vois pas bien comment faire changer ce comportement. D'après ce que je lis (ou de ce que je comprends de ce que je lis), il semble qu'il soit nécessaire d'agir sur le serveur SQL lui-même, et de lui passer un fichier de mots interdits en option. Je dois pouvoir cela, puisque j'ai accès au my.cnf. Mais il faut que je regarde tout ça plus précisément.

    J'aurais préféré une option dans la requête elle-même...

    Merci encore.

    JG.

  4. #4
    Membre très actif
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 174
    Par défaut
    Bonjour,

    si tu veux agir sur la longueur des mots, tu ajoutes dans ton fichier de config mysql, dans les sections appropriées :
    ([mysqld])
    ft_min_word_len=3

    ([myisamchk])
    ft_min_word_len=3

    ou tu démarres ton daemon mysql avec l'option --ft_min_word_len=3,e t tu recrées tes index.

    Ici, c'est un exemple de 3 caractères minimums.

    Ensuite, pour ce qui est de la liste des mots réservés, tu peux dire à mysql de n'éjecter aucun mot, en ajoutant le paramètre :
    ([mysqld])
    ft_stopword_file=''

    C'est bête, mais ça marche.
    Maintenant, pour mon serveur, il n'y a eu aucun impact de perf.

    Pour la liste des mots ignorés, je ne retrouve plus le lien...

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Par défaut
    J'ai trouvé les listes de mots interdits :
    http://members.unine.ch/jacques.savoy/clef/index.html

    je vais essayer d'utiliser le fichier FR, et voir ce que cela donne.

    Merci pour l'aide.

    JG.

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Par défaut
    C'est bon, cela fonctionne, avec le fichier FR.

    Il ne faut pas oublier de reconstruire les index concernés.

    merci à tous pour votre aide.

    JG.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comportement bizarre de mes FPS
    Par Ekinoks dans le forum OpenGL
    Réponses: 7
    Dernier message: 22/08/2005, 16h14
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 14h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 11h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 16h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo