2009-05-19 7 views
3

Tenir compte le site suivant:Quelle est la meilleure approche pour interpréter une entrée de texte à des fins de géocodage?

http://maps.google.com

Il a une principale entrée de texte, où l'utilisateur peut saisir entreprise, les pays, les provinces, les villes, les adresses et les codes postaux. Je me demande quelle est la meilleure façon d'implémenter une recherche comme celle-ci. Je réalise que Google Maps utilise probablement une recherche en texte intégral avec toutes sortes de données dans le même tableau, et il a une chance d'avoir un analyseur qui classe l'entrée (ie entre numérique, comme les codes postaux et les coordonnées, et textuel, comme les affaires et adresses).

Avec la propagation des données dans de nombreux tableaux et systèmes, un analyseur est essentiel. L'analyseur pourrait être construit à partir d'expressions régulières, ou pourrait être construit avec des outils IA tels que les réseaux neuronaux artificiels et les algorithmes génétiques.

Quelle approche recommanderiez-vous?

Répondre

3

Il peut être préférable d'agréger les données de toutes vos tables dans un index de recherche. Lucene est un moteur de recherche gratuit, similaire au fonctionnement du moteur de recherche de Google (index inversé), et il devrait vous permettre d'effectuer une recherche par l'une de ces valeurs ou par une combinaison de celles-ci avec une relative facilité.

http://lucene.apache.org/java/docs/

Lucene est livré avec son propre langage de requête (encore une fois, très similaire à Google ou tout autre syntaxe de sites de recherche Internet). Le seul inconvénient de l'utilisation de quelque chose comme Lucene est que vous auriez besoin de construire son index. Vous n'interrogeriez pas directement votre base de données (ce qui pourrait devenir très compliqué ... les index inversés sont plutôt conçus pour ce que vous essayez de faire), vous devez donc régulièrement recueillir de nouvelles informations de votre base de données et les ajouter à votre index . Il peut également être nécessaire de reconstruire votre index pour supprimer les données inutiles. Avec Lucene, vous obtenez une syntaxe de requête assez flexible que la plupart des gens connaissent (parce que presque tout le monde cherche sur internet), elle fonctionne très bien et n'est pas terriblement compliquée. En utilisant Lucene, vous évitez l'utilisation d'expressions régulières (qui ne sont pas le mécanisme de recherche de texte le plus performant), et vous n'avez pas besoin d'écrire votre propre analyseur.Devrait être un gagnant-gagnant, à part une petite courbe d'apprentissage pour construire un générateur d'index Lucene et comprendre comment interroger cet index.

+0

J'ai envisagé Lucene, mais aussi d'autres moteurs de recherche de texte intégral (c'est-à-dire l'index de texte complet de SQL Server et le texte d'Oracle). Mais je vais compter votre réponse comme un vote pour l'approche full-text-index seulement. –

+0

J'ai utilisé l'index de texte intégral SQL Server, et il a beaucoup à désirer. Il a une capacité d'interrogation limitée liée par les fonctions FREETEXT et CONTAINS, et fournit souvent des résultats très originaux et incohérents. Si vous avez une énorme quantité d'informations, cela semble fonctionner mieux (des centaines de milliers à des millions de lignes) ... rien de moins, et leur moteur de texte libre a beaucoup de problèmes. Même avec un grand volume, Lucene fournit un index beaucoup plus précis. Quant à Oracle ... ne pouvait rien dire là-bas, car je n'ai jamais utilisé leur indexation de texte. – jrista

1

Je voudrais avoir les données dans une base de données. Si les données devenaient trop volumineuses ou si je savais que ce serait énorme, j'attribuerais un identifiant à chaque entreprise, adresse, etc., puis aurais d'autres tables qui référencent ces données.

expressions régulières ne seraient nécessaires si l'utilisateur peut définir ce qu'ils veulent rechercher:

entreprise: Argos

Mais ce qui se passe s'ils veulent un Argos à Manchester (Désolé , je suis anglais), peut-être alors obtenir l'emplacement de l'utilisateur en fonction de leur IP mais ce qui se passe si on dit:

business: Argos Scotland

Maintenant vous ne savez pas si la société a deux mots, ou s'il y a un emplacement à côté. Tout cela doit être pris en considération.

P.s Désolé si cela n'a aucun sens.

+0

Je ne prétends pas enseigner à l'utilisateur une syntaxe pour utiliser mon formulaire. Mais je vais upvote votre réponse parce que je peux utiliser votre solution dans le futur (dans une autre application). –

0

Vous devrez prétraiter la requête avant d'effectuer une recherche en texte intégral. Si vous utilisez une base de données SIG, vous aurez déjà des colonnes comme city, areacode, country, etc. Convertissez votre requête en jetons séparés par des espaces ou des virgules, ou les deux. Ensuite, appuyez sur les colonnes individuelles pour voir correspondre. De cette façon, vous saurez quelle partie de la requête est la ville, l'indicatif régional, etc.

Vous pouvez également essayer des approches approximatives naïves, par exemple - 6 numéros consécutifs seront probablement un indicatif régional. Recherchez des mots courants tels que "route", "restaurant", "rue", etc., qui feront partie de nombreuses requêtes et utiliseront ensuite une approximation pour déterminer ce qu'ils recherchent. J'espère que cela t'aides.

Questions connexes