Partage
  • Partager sur Facebook
  • Partager sur Twitter

Prise en main de plusieurs mots dans une recherche

Besoin d'aide en php/sql

Sujet résolu
    23 janvier 2020 à 14:29:48

    Bonjour,

    C'est mon premier post sur ce forum, et j'ai besoin d'aide.

    En fait je développe une application Android, et celle ci communique avec un web service pour entrer en relation avec la base de données.

    Depuis mon application un utilisateur peut rechercher un nom de client pour obtenir une liste des clients correspondant au nom entré, afin d'obtenir des informations sur celui qui les intéresses, mais mon problème c'est que les noms de clients comportent plusieurs mots. Pour l'exemple je vais utiliser "Mairie de Paris". Je n'ai pas de soucis pour les trouver si je tape exactement "Mairie de Paris", mais je cherche un moyen pour que la requête fonctionne même si je tape juste "mairie paris" par exemple. 

    J'ai essayé plusieurs façons mais je n'ai pas encore trouvé.

    Merci d'avance pour votre aide.

    Voici mon code si ça peut aider :

    public function searchCli(Request $request){
            require __DIR__.DIRECTORY_SEPARATOR."..".DIRECTORY_SEPARATOR."Entity".DIRECTORY_SEPARATOR."sqlconnect.php";
            
            
              $nom = $request->request->has("nom") ? $request->request->get("nom") : "";
              
              
             
              $req ="SELECT  CLCLEUNIK, NOM, VILLE, CODEP FROM CLIENT WHERE NOM LIKE :nom COLLATE Latin1_general_CI_AI";
              $prepare = $pdo->prepare($req);
              $prepare->execute(
                [
                  "nom" => "%{$nom}%"
                ]
              );
    
              $clientsrecherche = $prepare->fetchAll(PDO::FETCH_OBJ);
    
              foreach($clientsrecherche as $key => $objet){
                foreach($objet as $key2 => $obj){
                  $obj=utf8_encode($obj);
                  $response[$key][$key2] = $obj;
                };
              }                     
                return new JsonResponse([ "response" => $response]);
           }

    -
    Edité par HenryDomont 23 janvier 2020 à 14:30:46

    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2020 à 14:54:10

      Bonjour,

      Je ne suis pas sûr qu'il y ait des solutions toutes simples avec juste une requête sql.

      Ayant pour projet ce type de besoin, j'ai expérimenté 2 types de solutions :

      - la première consiste à traiter la donnée d'entrée. En mettant tous les mots en minuscules, en enlevant les mots non significatifs type les articles, etc et à stocker le libellé ainsi épuré. C'est sur ce champs que se fait la recherche mais bien entendu il existe le champs complet qui sera restitué. Lors de la saisie il est fait les mêmes traitements sur la donnée saisie et ensuite on fait la requête sql. J'ai ajouté d'autres traitements comme la phonémisation la distance de levenshtein. https://www.php.net/manual/fr/function.levenshtein.php

      - la seconde consiste à utiliser l'intelligence artificielle avec php ai-ml. https://github.com/php-ai/php-ml et faire de la classification.

      Les 2 solutions ne sont pas incompatibles.

      A+

      -
      Edité par monkey3d 23 janvier 2020 à 14:54:43

      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2020 à 15:37:42

        Ok j'ai trouvé une solution, il suffisait de remplacer les espaces par des "%" dans $nom. Merci quand même 

        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2020 à 15:50:27

          A mon avis et ayant traité le sujet en profondeur, ta solution fonctionne bien pour le cas très très simple que tu soumets.

          Mais il y a des cas très courants - je dirai la majorité - où cela ne fonctionnera pas.

          Moi ce que je proposais est ce sont des solutions pour traiter un input utilisateur générique et essayer de trouver une réponse en s'affranchissant des fautes d'orthographe, de l'ordre des mots, des expressions incomplètes, etc.

          Enfin si ta solution te convient, c'est l'essentiel.

          Bye

          -
          Edité par monkey3d 23 janvier 2020 à 15:55:53

          • Partager sur Facebook
          • Partager sur Twitter

          Prise en main de plusieurs mots dans une recherche

          × 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