2010-11-25 24 views
3

Donc, je voudrais savoir quel est l'algorithme général pour mettre en œuvre une recherche instantanée qui est pas de charge intensive. Pas spécifiquement sur le web mais même dans une application desktop/winforms.mettre en œuvre l'algorithme de recherche instantanée fileté

Corrigez-moi si je me trompe mais que je ne peux pas envoyer d'appels asynchrones à chaque frappe de touche, n'est-ce pas? (Je ne sais pas how google instant manages this) Cela créerait une charge folle sur la base de données/etc

Ive pensé à quelque chose comme ceci:

  1. minuterie de Feu toutes les millisecondes xxx
  2. Sur le feu, l'entrée Désactiver, Désactivez la minuterie et envoyez un appel asynchrone à la recherche.
  3. Lorsque les retours d'appels, les résultats d'affichage, permettent l'entrée, activez la minuterie

Est-ce la façon dont il le général manipulé, ou est-il une meilleure façon?

+0

Je pense que vous ne devriez tirer après la personne _stops_ taper pendant un certain temps, plutôt que de désactiver l'entrée. – lijie

+2

Vous ne voulez pas désactiver la saisie en attendant que la recherche revienne - beaucoup de gens peuvent taper plus vite que vous ne pouvez obtenir les résultats de la recherche d'un serveur, et ce serait vraiment ennuyeux. –

+0

True, donc vous voulez dire appel asynchrone toutes les xxx millisecondes? En général lui-même je trouve un instant ennuyeux parfois, vous finissez par interroger des phrases que vous n'avez pas terminées, tout ce qui charge juste pour ne pas appuyer sur entrer. Peut-être que je suis un peu paresseux! lol Toujours mes gens pensent que ce serait impressionnant et regarder mieux! – gideon

Répondre

2

Les requêtes de recherche sont généralement assez petites, de sorte que la charge accrue sur le serveur peut ne pas être aussi importante que vous le pensez. L'envoi d'une requête sur chaque frappe devrait être bon tant que vous gardez une limite sur la longueur des requêtes.

Quoi qu'il en soit, c'est le serveur qui sait comment il est chargé, donc l'endroit où placer la gestion de la charge est du côté serveur. Par exemple, vous pouvez suivre une stratégie de quelque chose comme ceci:

Sur le client:

  • Lorsque le texte de recherche, envoyer au serveur.
  • Lorsque le serveur envoie des résultats, mettez à jour la page.

Sur le serveur, lorsqu'une requête est reçue d'un client:

  • Si j'occupe déjà une requête de ce client, annuler l'ancienne requête.
  • Si j'ai une requête en file d'attente provenant de ce client, jetez-la.
  • Ajoutez la nouvelle requête à une file d'attente de requêtes de recherche en attente, sauf si la file d'attente est pleine.
+0

Ce que vous dites sur le serveur est logique, mais rend la situation difficile en termes d'implémentation. Disons-le avec un service de données wcf (OData) exposant des données aux clients, je devrais avoir une sorte de service d'encapsulation pour vérifier les requêtes en file d'attente et les annuler correctement? – gideon