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 PostgreSQL Discussion :

Recherche Full text


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Recherche Full text
    Bonjour,

    Je suis actuellement en train de faire des recherches fulltext sous PostgreSQL mais j'aimerais savoir si c'est normal que je n'obtienne pas le même score pour une même requête.

    Par exemple, ces 3 requêtes me retournent 2 lignes avec les mêmes résultats sauf le score qui est différent.

    Requête 1: Sous MySQL, j'obtiens des scores de 5.26 et 10.62.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT MATCH (sem_trk_name,sem_trk_label,sem_trk_city_start,sem_trk_city_end)
    AGAINST ("waz*" IN BOOLEAN MODE) AS score, trk_id AS id, trk_name AS name,
    trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, trk_length AS
    length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id,
    trk_map_type 
    FROM track, search_match 
    WHERE MATCH(sem_trk_name,sem_trk_label,sem_trk_city_start,sem_trk_city_end) AGAINST
    ("waz*" IN BOOLEAN MODE) AND sem_trk_id=trk_id AND trk_status=0 
    GROUP BY trk_id ORDER BY score DESC
    Requête 2: Sous PostgreSQl, j'obtiens 0.3 et 0.1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ts_rank_cd(tsv, to_tsquery('waz:*')) AS score, 
    trk_id AS id, trk_name AS name, trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, 
    trk_length AS length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id, trk_map_type
    FROM search_match, track_group
    WHERE to_tsquery('waz:*') @@ tsv
    AND sem_trk_id=trk_id AND trk_status=0 
    ORDER BY score DESC
    Requête 3: Toujours sous PostgreSQL mais avec la fonction ts_rank() au lieu de ts_rank_cv(), j'obtiens 0.08 et 0.06

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ts_rank(tsv, to_tsquery('waz:*')) AS score, 
    trk_id AS id, trk_name AS name, trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, 
    trk_length AS length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id, trk_map_type
    FROM search_match, track_group
    WHERE to_tsquery('waz:*') @@ tsv
    AND sem_trk_id=trk_id AND trk_status=0 
    ORDER BY score DESC
    De plus, j'aimerais aussi avoir quelques éclaircissements car
    -avec ('waz:*') j'obtiens tous les lignes qui comprennent des mots débutant
    par 'waz'
    -avec ('waziers') j'obtiens tous les lignes qui comprennent le mot 'waziers'
    Mais je ne trouve pas comment avoir les lignes qui comprennent les mots se terminant par 'ziers'.

    Merci beaucoup pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    les réponses à vos deux questions se trouvent au chapitre 12 de la doc de postgres. (12.3 pour être plus précis)


    Pour la recherche de prefix, il en semble pas que ce soit embarqué dans la solution initial de postgresql.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par sarah59 Voir le message
    Bonjour,

    Je suis actuellement en train de faire des recherches fulltext sous PostgreSQL mais j'aimerais savoir si c'est normal que je n'obtienne pas le même score pour une même requête.

    Par exemple, ces 3 requêtes me retournent 2 lignes avec les mêmes résultats sauf le score qui est différent.

    Requête 1: Sous MySQL, j'obtiens des scores de 5.26 et 10.62.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT MATCH (sem_trk_name,sem_trk_label,sem_trk_city_start,sem_trk_city_end)
    AGAINST ("waz*" IN BOOLEAN MODE) AS score, trk_id AS id, trk_name AS name,
    trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, trk_length AS
    length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id,
    trk_map_type 
    FROM track, search_match 
    WHERE MATCH(sem_trk_name,sem_trk_label,sem_trk_city_start,sem_trk_city_end) AGAINST
    ("waz*" IN BOOLEAN MODE) AND sem_trk_id=trk_id AND trk_status=0 
    GROUP BY trk_id ORDER BY score DESC
    Requête 2: Sous PostgreSQl, j'obtiens 0.3 et 0.1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ts_rank_cd(tsv, to_tsquery('waz:*')) AS score, 
    trk_id AS id, trk_name AS name, trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, 
    trk_length AS length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id, trk_map_type
    FROM search_match, track_group
    WHERE to_tsquery('waz:*') @@ tsv
    AND sem_trk_id=trk_id AND trk_status=0 
    ORDER BY score DESC
    Requête 3: Toujours sous PostgreSQL mais avec la fonction ts_rank() au lieu de ts_rank_cv(), j'obtiens 0.08 et 0.06

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ts_rank(tsv, to_tsquery('waz:*')) AS score, 
    trk_id AS id, trk_name AS name, trk_filename AS filename, trk_duration AS duration, trk_rate AS rate, 
    trk_length AS length, trk_view AS view, trk_veh_id AS veh_id, trk_mem_id AS mem_id, trk_map_type
    FROM search_match, track_group
    WHERE to_tsquery('waz:*') @@ tsv
    AND sem_trk_id=trk_id AND trk_status=0 
    ORDER BY score DESC
    De plus, j'aimerais aussi avoir quelques éclaircissements car
    -avec ('waz:*') j'obtiens tous les lignes qui comprennent des mots débutant
    par 'waz'
    -avec ('waziers') j'obtiens tous les lignes qui comprennent le mot 'waziers'
    Mais je ne trouve pas comment avoir les lignes qui comprennent les mots se terminant par 'ziers'.

    Merci beaucoup pour votre aide
    MySQL est doté du plus mauvais moteur Full Text de tous les SGBDR. Lisez l'article que j"'ai écrit à ce sujet. http://blog.developpez.com/sqlpro/p9...ext-search-no/

    PostGreSL est doté d'un moteur Full Text hors norme et peut donner des résultats aléatoire... par exemple du fait de son incapacité à désaccentuer correctement (y compris diacritiques telle que c cédille ou ligature comme ans œuf, nœud...). Sa gestion des collations est en outre très pauvre...

    Enfin la recherche de mot "se terminant par" n'est pas dans la norme SQL du Full text et n'est implémenté dans aucun moteur Full text... Il faut faire cela à la main, par exemple en ajoutant une colonne calculée inversant le mot, l'indexer et utiliser le LIKE.
    Bien entendu cela n'est possible que si vous avez accès aux tables internes du FT, ce qui est le cas dans MS SQL Server...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci à tous les deux pour vos réponses, je vais lire tout ça.

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

Discussions similaires

  1. Recherche Full Text
    Par fadeninev dans le forum SQLite
    Réponses: 1
    Dernier message: 20/10/2006, 10h21
  2. [recherche FULL TEXT ]
    Par viny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/09/2006, 17h08
  3. [MySQL] Recherche FULL TEXT IN BOOLEAN MODE et les Quotes
    Par GarGamel55 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/01/2006, 20h01
  4. [Info]moteur de recherche full text en environnement j2ee
    Par ddams dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/11/2004, 19h39
  5. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 22h30

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