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

PHP & Base de données Discussion :

Recherche SQL approximative


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut Recherche SQL approximative
    Bonjour,

    J'ai besoin dans le cadre d'un projet de faire un recherche approximative.
    Je m'explique:

    Si l'utilisateur rentre Bottlegrounds alors que mon entrée se nomme Battlegrounds, je voudrais que me base me retourne quand même Battlegrounds ce qui permet à l'utilisateur de faire des fautes d'orthographe qui n'empêcheront pas la recherche. Battle Grounds devrait marcher également.

    Je n'ai trouvé aucune réponse satisfaisante sur Internet.

    Avez-vous une idée ou connaissez-vous une librairie PHP qui permettrait de faire des recherches approximatives ?

    Merci d'avance.

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    intéresse toi à des trucs qui calculent la "distance" entre 2 mots comme la distance de levenshtein... ça permet une recherche approximative
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Merci à toi mais j'aimerais pouvoir faire ma recherche dans la base SQL plutôt que de récupérer toute la table et faire un levenshtein à chaque case.
    N-y a-t-il aucun moyen de faire un recherche SQL su genre LIKE mais avec une méthode de levenshtein ou autre ?

  4. #4
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    Tu peux éventuellement tester la clauses match ... against() mais ça restera assez limité malheureusement, à voir si ça te suffit (tout dépends du degré d'approximation et des performances que tu recherches).
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  5. #5
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    tu peux facilement trouver des implémentation de levenshtein pour mysql sous forme de fonction stockée...

    mais ça t'oblige à faire à la min ce que fait l'index texte en générant une liste de mot qui référence ta liste de textes... un index text ne servirait pas vraiment du fait que l'utilisation de fonction sur une colonne dans un where empêche l'utilisation d'index sur elle...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Décembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Pourrais-tu m'indiquer comment implémenter cette fonction de façon simple ?

    Merci

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    tu trouveras plein d'implémentation de cet algo avec "mysql levenshtein" dans google...
    tu as des version avec 1 ou 2 fonctions stockées, préfères celles avec 1 seule et si tu as une erreur 1064 c'est certainement du à un problème de délimiteur comme pour la version ici par exemple...

    le code qu'il propose est:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    DELIMITER //
    CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
    RETURNS INT
    DETERMINISTIC
    BEGIN
      DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
      DECLARE s1_char CHAR;
      DECLARE cv0, cv1 VARBINARY(256);
      SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = '\0', j = 1, i = 1, c = 0;
      IF s1 = s2 THEN
        RETURN 0;
      ELSEIF s1_len = 0 THEN
        RETURN s2_len;
      ELSEIF s2_len = 0 THEN
        RETURN s1_len;
      ELSE
        WHILE j <= s2_len DO
          SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
        END WHILE;
        WHILE i <= s1_len DO
          SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
          WHILE j <= s2_len DO
            SET c = c + 1;
            IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
            SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
            IF c > c_temp THEN SET c = c_temp; END IF;
            SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
            IF c > c_temp THEN SET c = c_temp; END IF;
            SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
          END WHILE;
          SET cv1 = cv0, i = i + 1;
        END WHILE;
      END IF;
      RETURN c;
    END//
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. [FORMULE]Recherche valeur approximative entre bornes
    Par philname dans le forum Excel
    Réponses: 2
    Dernier message: 25/05/2007, 15h49
  2. [VBA-E] Recherche SQL
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/04/2007, 15h19
  3. [SQL] resulat recherche sql
    Par digger dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/12/2006, 17h26
  4. Requete de Recherche SQL HS ?
    Par Pitoux dans le forum Accès aux données
    Réponses: 2
    Dernier message: 06/10/2006, 14h34
  5. [MySQL] Degré de pertinence dans une recherche sql
    Par Invité(e) dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/11/2005, 09h59

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