2011-06-06 2 views
1

Je voudrais faire un moteur de recherche simple avec javascript. L'idée est de lire un fichier texte côté serveur, de l'analyser et de trouver toute expression correspondant à la requête de l'utilisateur. Et oui, je dois utiliser les scripts côté client.Moteur de recherche simple avec javascript. Toute suggestion?

Avez-vous une suggestion?

Merci .

EDIT - Détails pour répondre commentaires

je dois analyser 1 seul fichier (max 10.000 lignes.). Je n'ai pas besoin d'une auto-complétion: je veux juste afficher les chaînes correspondant à une requête dans un élément SELECT. Aussi, je voudrais éviter d'utiliser JQuery si possible.

+0

Pourquoi ne pas AJAX et le faire côté serveur? – LouwHopley

+0

De combien de fichiers avez-vous besoin pour analyser? Est-ce juste un fichier, ou plusieurs? S'il y a beaucoup de fichiers volumineux, cela peut devenir lourd sur le réseau rapidement. – Arend

+0

Voulez-vous effectuer cette recherche une ou plusieurs fois par page? C'est à dire. À quel point doit-il être efficace? –

Répondre

2

Vous rencontrerez des problèmes de navigateur croisés avec la requête. Il est donc judicieux d'utiliser une bibliothèque qui résume ce SI. Cependant, voici un squelette possible pour les appels nécessaires.

Soyez assuré que le stockage d'un fichier volumineux dans une variable javascript n'est pas très cleaver. Méfiez-vous de ce que vous faites! Pourquoi ne pas AJAX et le faire côté serveur?

var words = []; 
var query = ""; 

function parseText(data) { 
// taking care of data 
// check null handle errors 
var data = data.replace(/\W+/g,' '); // replace non words with spaces 
words = data.split(' '); // split and cache this if you need it again without refetching 
doSearch(query); 
} 

function doSearch(query) { 
    // handle the loop trough the array 
    // you may save the data into a variable and use regex instead of splitting into an array 
} 

function handler() { 
if(this.readyState == 4 && this.status == 200) { 
    // so far so good 
    if(this.responseXML != null && this.responseXML != "") 
    // success! 
    parseText(this.responseXML); 
    else 
    parseText(null); 
} else if (this.readyState == 4 && this.status != 200) { 
    // fetched the wrong page or network error... 
    parseText(null); 
} 
} 

query = "someword"; 
var client = new XMLHttpRequest(); 
client.onreadystatechange = handler; 
client.open("GET", "/remote.txt"); 
client.send(); 
+0

Parfait, merci! Mon fichier n'est pas très gros donc je suppose que votre suggestion fera l'affaire. – pasta

1

Si je vous ai bien compris, vous avez besoin d'une saisie semi-automatique. Pour jQuery je pourrais recommander this one.

0

Quelques recommandations générales:

  • Si vous ne souhaitez pas utiliser jQuery ou bibliothèques similaires, utilisez un (micro) bibliothèque de votre choix (par exemple moo.ajax (disclaimer:. Je n'ai jamais utilisé, ce aucune garantie, yada yada)) pour au moins résumer la requête AJAX pour le fichier texte. Ne soyez pas tenté de penser qu'il est trivial d'écrire le vôtre et de le faire fonctionner avec plusieurs navigateurs.
  • Si vous souhaitez optimiser la vitesse, utilisez une structure trie ou similaire pour suivre les chaînes. Pour 10 000 lignes avec une entropie raisonnable (c'est-à-dire des données pas complètement aléatoires), les besoins en mémoire pour cela ne sont pas un problème, espérons-le. Vous pouvez vouloir ignorer les petites requêtes (c.-à-d. Moins de 3 caractères ou similaire).
  • Si vous souhaitez optimiser l'utilisation de la mémoire, ne stockez la liste des chaînes en mémoire que sous forme de tableau et utilisez une simple boucle indexOf ou une expression régulière (gardez à l'esprit /foo/.test(str) est plus rapide que str.match(/foo/)!) Test pour obtenir la liste des chaînes correspondantes.
  • Utilisez l'écriture innerHTML sur l'élément select et la concaténation de chaîne pour générer le <options>. Manipuler des milliers d'éléments DOM a tendance à être beaucoup plus lent. Assurez-vous que le code HTML échappe aux valeurs et sachez que vous risquez de perdre l'état sélectionné (et la position de défilement) dans la liste, au cas où cela serait important pour votre application.

Espérons que ça aide!