2009-06-21 5 views
2

Je suis en train de mettre en place une fonctionnalité de saisie semi-automatique "Google Suggest" pour la recherche d'étiquettes en utilisant la saisie semi-automatique de jQuery.Quelle est la meilleure façon d'implémenter le service Web pour l'autocomplétion ajax?

Je dois fournir un service Web à jQuery en lui donnant une liste de suggestions basées sur ce que l'utilisateur a tapé. Je vois 2 façons d'implémenter le service Web:

1) il suffit de stocker toutes les variables dans une base de données et de rechercher la base de données en utilisant l'entrée utilisateur comme préfixe. C'est simple, mais je suis préoccupé par la latence.

2) Utiliser un trie en cours de processus pour stocker toutes les étiquettes et rechercher des résultats correspondants. Comme tout sera en cours, je pense que cela aura une latence beaucoup plus faible. Mais il y a plusieurs difficultés: -Quel est le bon moyen d'initialiser le processus de démarrage? Je suppose que je vais stocker les données de l'étiquette dans une base de données et les récupérer et les transformer en un trie quand je commence le processus. Mais je ne suis pas sûr de comment. J'utilise Python/Django. -Lorsqu'un nouveau tag est créé par un utilisateur, je dois insérer le nouveau tag dans le fichier. Mais disons que j'ai 5 processus Django et donc 5 essais, comment puis-je dire aux 4 autres essais qu'ils ont besoin d'insérer un nouveau tag? -Comment s'assurer que la trie est threadsafe car mes processus Django seront threadés (j'utilise mod_wsgi). Ou n'ai-je pas à me soucier de threadsafty à cause du GIL de Python? -De toute façon, je peux stocker la fréquence d'utilisation du tag dans le trie aussi? Comment puis-je savoir quand la chaîne de la balise se termine et quand la fréquence commence-t-elle? si je stocke apple213 dans le trie, est-ce "apple" avec la fréquence 213 ou est-ce "apple2" avec la fréquence 13?

Une aide sur les problèmes ci-dessus ou des suggestions sur une approche différente serait vraiment appréciée.

+0

combien de tags pensez-vous avoir? – Josh

+0

Parlez-vous d'un service Web où vous utiliseriez quelque chose comme SOAP? Si c'est le cas, j'éviterais d'utiliser un service web pour cela car cela ajouterait une couche supplémentaire de complexité et causerait plus de latence. Pour la saisie semi-automatique, je voudrais envoyer des requêtes AJAX au serveur et interroger la base de données pour des suggestions ou des requêtes à partir des résultats de la base de données en cache si possible. – rich

+0

Toutes les étiquettes seraient créées par l'utilisateur, il est donc difficile de dire combien il y en aura. Cela dépend vraiment de la popularité de mon site – Continuation

Répondre

4

Ne soyez pas préoccupés par la latence avant que vous mesure choses - faire un tas de pseudo-tags, les coller dans la DB, et latences mesure pour les requêtes typiques. En fonction de la configuration de votre base de données, votre temps de latence peut être correct et vous évitez les soucis inutiles.

Ne vous inquiétez toujours de filetage, mais - la GIL ne fait pas les conditions de course disparaissent (le contrôle peut basculer entre les threads à une limite d'instruction de pseudo-code, ainsi que lorsque le code C dans une extension sous-jacente ou builtin exécute). Vous devez d'abord vérifier l'attribut threadsafety du module API DB que vous utilisez (voir PEP 249), puis utiliser le verrouillage approprié ou générer un petit pool de threads dédiés qui effectuent des interactions DB (réception de demandes sur une file d'attente. renvoyer des résultats sur un autre, l'architecture normale pour un thread sain et facile en Python).

1

J'utiliserais la première option. 'KISS' - (Keep It Simple Stupid).

Pour de petites quantités de données, il ne devrait pas y avoir beaucoup de temps de latence. Nous effectuons le même genre de recherche de noms et les résultats apparaissent assez rapidement sur quelques milliers de lignes.

Espoir qui aide,

Josh

Questions connexes