Partage
  • Partager sur Facebook
  • Partager sur Twitter

Msqyl: Match against avec opérateur plus (+)

l'opérateur + n'est pas pris en compte =(

    26 avril 2011 à 15:24:43

    Bonjour!!

    Mon problème est tout simple et pourtant je ne vois pas ce qui cloche:

    imaginons la table simplifié suivante, représentant les 36000 communes de france:
    city(id_city, name_city)

    Toute les nom composé sont en trait-d'union, et name_city possède bien un index "full-text", encodé en utf8_general.

    Prenons une ville à rechercher, offrant beaucoup de possibilité de résultat: Sainte étienne par exemple. =)

    SELECT *,MATCH (name_city) AGAINST ('sainte etienne') as pertinance 
    FROM city  
    where MATCH (name_city) AGAINST ( '+*sainte* +*etienne* ' in boolean mode) 
    order by pertinance desc
    


    On trouve cette petite requête un peut partout sur la toile, et pourtant:

    En 1er, j'ai effectivement tous les sainte-Etienne, (sainte-Etienne-du-bois, Sainte-Etienne-sur-Chalaronne, etc).

    sauf que...

    J'ai aussi toutes les villes qui contiennent sainte sans contenir etienne.

    Du coup, si on recherche Chapelle Sainte Etienne, on a bien "Chapelle-Sainte-Etienne (La)", mais l'on a également tous les "...Chapelles...", "...sainte..." etc, ce qui n'est pas logique et non pertinent dans ce cas.

    Et pourtant :

    Citation : Mysql 5 rérérence manual

    A signe + initial indique que le mot doit être présent dans la ligne retournée.



    J'ai réglé le problème ainsi:

    SELECT *, MATCH (name_city) AGAINST ('Sainte-étienne') as pertinance 
    FROM city 
    where MATCH (name_city) AGAINST ('*Sainte *étienne *Chapelle ' IN BOOLEAN MODE ) 
    and id_city in (
    select id_city from city where MATCH (name_city) AGAINST ('+*étienne ' IN BOOLEAN MODE )
    ) 
    and id_city in (
    select id_city from city where MATCH (name_city) AGAINST ('+*Chapelle ' IN BOOLEAN MODE )
    )
    order by pertinance desc
    



    C'est moche hin? Sans compté que je doit pas mettre dans les sous-requête les mots inférieurs a 3 lettres, vue que match ne retourne rien dans ce cas la.

    Sans compté que le temps d'exécution de la requête est multiplié par plus de 10...je ne peut décemment pas retenir cette solution.

    De plus, je ne veut surtout pas qu'il ignore les mot inférieur a 3 lettres, si la recherche portait sur un text, ok, mais pour des nom de villes, les mot tel quel "sur", "le", "du"...sont presque aussi pertinent que les autres mot.

    Avant que je me tourne vers un traitement php qui me re-filtre tout sa comme je veut, quelqu'un aurai il une idée?

    merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2011 à 23:51:25

      Pour seulement 36000 lignes tu peux utiliser une bête recherche LIKE avec des %.

      Sinon, utilise un vrai moteur fulltext, comme Xapian ou Sphinx.
      • Partager sur Facebook
      • Partager sur Twitter
        27 avril 2011 à 15:18:14

        je veut simplement comprendre pourquoi l'opérateur + ne marche pas...

        Avec like, adieu le trie par pertinence...et puis j'aimerai me familirisé avec celui si, car après je compte l'utilisé sur des fonctionnalité qui étendrons leur recherche sur casi toute la base.
        Les villes c'est juste un exemple.

        Je vient donc en temps qu'un Zero qui apprend plutôt qu'un zero dans le besoins.

        J'ai regarder Ce qu'était Xapian et Sphinx...Sa a l'air sympa, mais je ne vais pas utilisé une Pelteuse, alors qu'une simple pelle de compétition fait l'affaire.

        match...against marche très bien, le seul truck c'est qu'il me donne plus de résultat que je lui demande xD.
        Et donc je veut simplement comprendre pourquoi l'opérateur + ne marche pas...

        merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter

        Msqyl: Match against avec opérateur plus (+)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown