2011-12-24 6 views
4

J'ai parcouru un réseau social, et j'ai trouvé une possibilité de recherche de personnes par: nom, tranche d'âge, ville, pays et sexe. La chose intéressante est que toutes ces informations peuvent être insérées dans une zone de texte séparés par l'espace. Ensuite, le moteur de recherche en quelque sorte l'analyse de manière très précise et retourne une liste de résultats. D'une part, cela semble assez simple: diviser la requête par espace et rechercher toutes les tables pertinentes pour l'occurrence. Jusqu'ici tout va bien. CependantRecherche intelligente avec une entrée

  1. Il y a des villes dont les noms sont plus de 2 mots et l'utilisateur peut les saisir différemment comme il est du texte libre.
  2. Il y a des noms qui sont plus de 2 mots

Question:

Comment peut-on diviser la requête de telle sorte, que nous savons certainement que partie doit rechercher où? c'est-à-dire nom dans la table des utilisateurs, ville dans le tableau des villes, le pays dans les pays etc.

Ce que je l'ai fait jusqu'à présent est:

  1. utilisateurs fill source de données avec tous les utilisateurs
  2. Vérifiez si le pays en provenance des pays tableexist dans la requête
  3. si elles existent puis filtrer la source de données que les utilisateurs de ce pays seulement
  4. Vérifiez si le tableau Villes existe dans la requête
  5. si disponible, puis filtrez la source de données pour avoir des utilisateurs de cette ville seulement

et ainsi de suite pour chaque table, alors que chaque fois que nous trouvons un match dans la table- on enlève la partie trouvé de la requête, nous laissant avec le paramètre le plus libre: le nom.

Cela semble fonctionner si l'utilisateur aurait su exactement comment les villes/pays etc. sont écrits dans mon db, mais la réalité est que l'utilisateur peut entrer dans une partie de la ville ou fausser la ville.

Je ne sais pas si je suis dans la bonne direction du tout avec ce que j'ai fait. Est juste un point de départ ...

PS: J'ai juste besoin d'un flux d'algorithme, donc le langage de programmation ne mesure pas vraiment. Toute idée ou orientation est plus que bienvenue.

Merci

Répondre

0

Ce genre de requêtes est pas bon pour relational databases. Si ce n'est pas un must, vous pouvez penser à utiliser Lucene.Net(c#) ou Lucene(java)

0

J'ai aucune expérience, mais je suppose que cela est natural language processing

Je pense qu'une partie de faire ce type de traitement accepte que vous avez gagné » Je comprends toujours bien. Il s'ensuit que votre but est d'essayer d'identifier les cas où vous êtes confiant dans la prise de certaines hypothèses.

Par exemple,

Si un utilisateur cherchait Unetelle dans new york city, ils ne seraient pas taper comme jane new york city doe, le nom et la ville seraient toujours groupes contigus. Vous ne connaissez pas la longueur de chaque groupe, mais vous n'avez qu'un nombre limité de combinaisons à essayer. Étant donné jane doe new york city, vous pouvez itérer les combinaisons de groupes contigus.

scoreAsName('jane') 
scoreAsName('jane doe') 
scoreAsName('jane doe new') 

... et ainsi de suite ... et faire la même chose pour scoreAsCity.

Il devrait y avoir des combinaisons gagnantes claires à score élevé pour les deux. Peut-être, le meilleur choix serait le combo du nom et du score de la ville qui donne la somme combinée la plus élevée. Vous auriez besoin de faire un algorithme de notation, probablement basé sur des correspondances de base de données, mais il pourrait aussi utiliser une entrée auxiliaire, comme, augmenter le score d'une correspondance de nom local.

Sujet très intéressant.

Questions connexes