2009-09-30 3 views
4

J'ai un champ de texte dans mon application Web où je veux effectuer la saisie automatique (par exemple, l'utilisateur tape "St" et je peux suggérer "Steve"). Les noms que je compare sont dans une table de base de données SQL des utilisateurs. Ma question est, comment puis-je faire en sorte que cela se produise à l'échelle d'utilisateurs massifs?Auto-complétion pour les noms par rapport à une base de données SQL

  1. Il existe une recherche de texte complet DB ou quelque chose comme Lucene. Cela serait-il même approprié pour une requête "commence par" comme celle-ci?

  2. Existe-t-il un moyen de configurer un index DB normal pour les recherches de type "commence par"?

  3. D'autres idées qui me manquent totalement?

Toute aide serait appréciée. Merci.

Répondre

4

Ceux-ci devraient faire le travail tant que vous avez un index sur la colonne de nom.

SQL Server:

SELECT TOP 10 name FROM names WHERE name LIKE 'St%' 

MySQL (selon Bart J):

SELECT name FROM names WHERE name LIKE 'St%' LIMIT 10 

Oracle:

SELECT name FROM names WHERE name LIKE 'St%' AND rownum < 10 
+0

Merci pour la réponse ici. Je ne me suis pas rendu compte qu'il pourrait utiliser l'index sur une requête comme celle-ci, mais expliquer le plan confirme qu'il fonctionne correctement. – Sean

+0

erikkallen - désolé pour le nitpicking, mais je pensais en fait TOP était un "mot clé". Atleast pour Mysql, je pense que vous voulez dire - "SELECT nom de noms WHERE nom LIKE 'St%' LIMIT 10" –

+0

@Bart: Correction ... – erikkallen

1

Si vous avez un index ordonné sur le champ que vous voulez compléter automatiquement, il peut être utilisé dans une requête de style "commence par".

0

La plupart des indices ascendants seront utilisés pour l'optimisation avec LIKE ' xxx% '- requête de type. Pour les performances, je vous recommande de fixer une limite au nombre de résultats que vous essayez de revenir de la base de données:

SELECT TOP 10 LastName 
FROM tbl 
WHERE LastName LIKE @start + '%' 
ORDER BY LastName 

Il y a une limite à la quantité de défilement que vous voulez faire.

1

Cochez cette case article en recherche plein texte dans SQL Server.

Et this un sur les types d'index il y a et quand les utiliser.

-1

Ne le faites pas en SQL ...?

Envoyez la liste et la saisie semi-automatique dans le navigateur. Ceci est ce que nous faisons.

De cette façon, nous évitons quelque chose comme un client de Hong Kong -> Suisse serveur web -> Suisse SQL serveur aller-retour par touche utilisateur touche. Nous faisons un voyage pour charger la page, alors tout est côté client.

Nous avons quelque chose comme 9000 articles dans notre plus grand ensemble de données qui pilote automatique Suggérer le contrôle (la plupart sont beaucoup moins)

Modifier, après commentaire:

Comme je l'ai dit, la plupart de nos listes sont beaucoup moins . Cependant, même le chargement de 200k supplémentaires est préférable, puis le déclenchement à une base de données chaque touche.Le fait que vous puissiez aller-retour implique "intranet", donc le temps de chargement de la page est également sans importance. 200k n'est rien de toute façon comparé à la latence aller-retour ...

+0

Ceci est un bon moyen de provoquer de longues pages de chargement. 9.000 articles est un 70K-200K supplémentaire sur chaque chargement de page, et c'est juste pour un champ. – tster

+0

@tster: Donc vous préférez aller à la base de données à chaque pression de la touche? – gbn

+0

Pourquoi cela a-t-il été déprécié? Ce n'est pas une si mauvaise idée. +1 Les listes devraient, bien entendu, se trouver dans un fichier js externe pouvant être mis en cache et, de préférence, chargé de manière asynchrone. – erikkallen

Questions connexes