4

Cette question est des gens faciles. Rendre la saisie semi-automatique belle dans le côté client d'une application web est simple. Il y a beaucoup de plugins. Mais, à l'arrière, côté serveur, quelle est la meilleure façon de le faire? Je n'aime pas l'idée de frapper la DB avec chaque touche pressée par l'utilisateur.Quelle est la meilleure façon d'implémenter la saisie semi-automatique sur le serveur?

Je pensais à sphinx, ou à un moteur de recherche en texte intégral parallèle à votre site. Par exemple, si j'ai un site web PHP (trafic élevé), je peux créer un script Python parallèle qui récupère les requêtes http de mes "boîtes de texte autocomplete". Ensuite, lorsqu'un utilisateur appuie sur une touche du côté client, les requêtes AJAX sont dirigées vers ce script Python qui peut utiliser une stratégie spéciale.

Quelle est votre approche?

Certaines conventions:

  • Essayez de ne pas frapper la DB. Je veux dire, obtenir la demande et faire quelque chose SELECT * FROM foo O WH barre comme "req%" n'est pas une bonne réponse. C'est peut-être une bonne stratégie, mais je sais comment le faire. *
  • Les données répliquées peuvent être un bon choix.
+0

Vous semblez avoir des suppositions non déclarées concernant les langues et les technologies disponibles côté serveur. Il serait plus facile de donner une réponse convaincante si vous les énoncez. – bmargulies

+0

Quelle est la taille de l'ensemble des chaînes candidates? Quels critères sont utilisés pour les classer (c'est-à-dire le même pour tout le monde, par utilisateur ou même par critère de demande)? –

+0

@bmargulies J'essaie de me concentrer sur l'architecture. Mais, en tant que guide.Le "cadre de recherche" (par exemple Lucene, Sphinx, Memcache, peu importe) peut être tout ce qui peut être installé sur un serveur Linux. Ensuite, à propos des langages, s'il s'agit d'un framework largement adopté, il aura des librairies, mais pourra envisager de bonnes langages: Java, Phython, PHP. – santiagobasulto

Répondre

8

Je suis d'accord que vous avez besoin d'une meilleure solution. Apache solr a une "suggestion" caractéristique que vous pouvez utiliser plutôt bien. Si votre jeu de données est petit, placez toutes les données en mémoire et faites simplement une simple boucle.

Sur le frontal, je recommande d'utiliser setTimeout() pour attendre environ 200 ms avant de lancer l'appel ajax. Si au cours de ces 200 ms, une autre touche est déclenchée, annulez le dernier délai et recommencez un autre. C'est une solution vraiment propre où il ne frapperait pas la base de données à chaque frappe. Je l'ai utilisé dans le passé et ça marche très bien.

Ceci explique comment utiliser jquery et comment créer une autocomplétion vraiment bien. http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/

+0

Voici un article que j'ai utilisé dans le passé http://www.sematext.com/products/autocomplete/index.html –

+0

Vraiment vraiment (boucle il 1000 fois) génial. Merci beaucoup. Je vais y jeter un coup d'oeil. – santiagobasulto

0

Vous dites dans les commentaires que "c'est un petit ensemble de données" de mots-clés. Ainsi, il peut être approprié que le client demande la liste entière dès que l'utilisateur commence à taper dans le champ, puis que le JavaScript réponde aux modifications de l'entrée de l'utilisateur côté client. C'est un hit par champ par page (et seulement si l'utilisateur tape dans le champ), et vous pouvez le mettre en cache sur le serveur de façon à ce qu'il frappe rarement la base de données.

Edit: Mise en cache sur le serveur est une grande victoire, car la liste est la même pour chaque demande et pour tous les utilisateurs, mais encore mieux, cela signifie que vous pouvez mettre en cache la liste dans le navigateur du client en utilisant un Expires ou Etag en-tête avec une période appropriée dans la réponse. Ainsi, l'utilisateur peut obtenir une saisie semi-automatique illimitée pour un seul accès au serveur (bien mis en cache) pendant toute la période du cache du navigateur.

+0

Oui, j'ai réfléchi à ça. Mais ce n'est pas évolutif. Je veux dire, si quelque chose change dans le futur je ne peux pas continuer à charger toutes les données dans le client. Merci quand même – santiagobasulto

+1

@santiago, tout en considérant l'évolutivité peut être important, l'optimisation pour le présent connu a beaucoup plus de sens que l'optimisation pour l'avenir inconnu :) Aussi, je dirais que c'est évolutif dans une certaine mesure; Si la liste devient assez grande, commencez par demander tous les mots-clés correspondant à la première lettre, peut-être plus tard les deux premières lettres, etc. Étant donné que le surdéploiement de chaque requête est considérable, vous pouvez également demander une liste de possibilités. serveur chaque fois qu'un utilisateur met en pause la saisie d'une fraction de seconde. –