J'utilisé jusqu'à présent lapi de google mais je souhaite changé pour différentes raisons.
J'ai donc recherché un peu et adapté un code selon mes besoin et ma bdd, tout marche .
J'aimerais juste que quand on saisie 'st' ou saint' cela nous propose quand même la ville et pas uniquement l'orthographe exacte qu'il y a en bdd
comme 'saint martin d'hères' ou 'st martin d'hères'
Cote requete pour allé piocher dans la bdd:
<?php
function connect() {
return new PDO('mysql:host=localhost;dbname=listing', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
$pdo = connect();
$keyword = '%'.$_POST['keyword'].'%';
$sql = "SELECT DISTINCT Libelle_acheminement FROM villes_de_france WHERE Libelle_acheminement LIKE (:keyword) ORDER BY Libelle_acheminement ASC LIMIT 0, 10";
$query = $pdo->prepare($sql);
$query->bindParam(':keyword', $keyword, PDO::PARAM_STR);
$query->execute();
$list = $query->fetchAll();
foreach ($list as $rs) {
// put in bold the written text
$select_ville = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['Libelle_acheminement']);
// add new option
echo '<li onclick="set_item(\''.$rs['Libelle_acheminement'].'\')">'.$select_ville.'</li>';
}
?>
Coté js:
function autocomplet() {
var keyword = $('#country_id').val();
$.ajax({
url: 'ajax_refresh.php',
type: 'POST',
data: {keyword:keyword},
success:function(data){
$('#country_list_id').show();
$('#country_list_id').html(data);
}
});
}
// set_item : this function will be executed when we select an item
function set_item(item) {
// change input value
$('#country_id').val(item);
// hide proposition list
$('#country_list_id').hide();
}
Je n'ai jamais trouvé de solution simple à ce problème.
Ce que je fais ...
Dans ton référentiel - donc pour l'instant je ne suis pas au niveau de la recherche - d'abord j'élimine tous les mots non significatifs appelés stopword in english - le, la, d' (c'est ton cas) etc puis je prends le restant que je mets strictement en minuscule non accentué et je considère que ce sont des mots clefs que j'associe au libellé complet. Un ensemble de keyword en base associé au libellé complet (je ne fais pas la modélisation).
Donc par exemple dans ton cas, ce pourrait être 'saint martin heres' avec heres sans accent.
Lors de la recherche, on applique le même algo et on compare sur les mots clefs.
Si on veut aller plus loin par exemple la personne qui saisit 'Saint Martin Here' sans s alors soit tu considères que 2 mots justes sur 3 suffisent soit tu te lances dans la phonémisation.
Comme je te disais pas de solution simple.
Dernier truc que je fais encore plus complexe et complémentaire, tu ajoutes de l'intelligence artificielle. Bon juste pour trouver des villes je ne pense pas que cela vaille le coup.
Mais c'est assez fun et possible en php sans passer par Google et consort : https://github.com/php-ai
Je me serais "machinalement" orienté sur du fulltext même si ça paraît un peu overkill de prime abord. Et avec MySQL, déjà, si la colonne a un interclassement insensible à la casse et aux accents ça te fait déjà ça de moins à gérer (indépendamment de l'usage d'un fulltext ou non).
Normalement, les mots de moins de 3 lettres sont automatiquement exclus et au pire, tu dois pouvoir définir ta propre liste de stopword. Par contre, apparemment, il n'y a pas moyen de définir des équivalences de mots (type st = saint). Donc tu normalises via une colonne dédiée (indexée ) aussi bien ce que tu insères que la saisie utilisateur (type preg_replace('~\bst(e)?\b~i', 'saint\1', ...) et autre truc du genre).
Quoi qu'il en soit, AMHA, LIKE n'est pas du tout approprié, surtout comme ça, sans découpage en "mots". Dans le meilleur des cas ça permettra juste de retrouver une ville qui contient ce qui est cherché, ça risque d'être pas vraiment pertinent, tu ne peux pas non plus trier par pertinence, ce n'est pas efficace. L'avantage du fulltext sur like, c'est que tu peux le faire évoluer à bien des égards vu toute la panoplie d'options en tout genre à disposition.
Ceci dit c'est plus un avis personnel qu'autre chose. Tout dépend aussi jusqu'où tu veux pousser ta fonctionnalité et de ton public, celui qui se doute que ça fonctionne avec un LIKE derrière aura probablement l'idée de chercher à partir de la sous-chaîne la plus significative du nom de la ville contrairement à un néophyte/non-informaticien.
PS : les caractères % et _, pour un LIKE, devrait être échappés
J'ai des système plus ou moins tout fait mais rien qi me convient,
J'ai pensé a stocké dans un array mais bon c'est énorme 38000 Communes
J'ai trouvé vicopo, je tenais à partager ca avec vous pour le coup
il gére le fameux problème des ' ou saint ou st
Mais avec ce script j'ai un nouveau problème si on tape: Lyon:
Il propose tous les code postaux de lyon qui correspondent aux arrondissement, problème identique pour paris et marseille forcèment, si je pouvais limiter à seulement la ville principale enfin voilà pour ceux qui cherche comme moi vous avez éventuellement:
Ma solution est sans doute un peu complexe à mettre en oeuvre mais elle est faite pour traiter un problème un peu plus global de conversation avec un assistant en mode texte ... d'où à la fin le coup de l'IA.
Si travailler avec une API ne te dérange pas, let's go.
Bye
- Edité par monkey3d 6 avril 2020 à 18:36:07
Autocomplet ville
× 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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli