2011-06-06 7 views
1

私はjavascriptを使って簡単な検索エンジンを作っていました。この考え方は、サーバー側のテキストファイルを読み込んで解析し、ユーザーのクエリに一致する式を見つけることです。 はい、クライアント側のスクリプトを使用する必要があります。javascriptを使用した簡単な検索エンジン。なにか提案を?

ご意見はありますか?

ありがとう

EDIT - 詳細なコメント、私は1つのファイル(最大10.000行)を解析する必要が

に答えます。私は自動補完を必要としません:私はちょうどSELECT要素にクエリに一致する文字列を表示する。また、JQueryの使用を避けたいと考えています。

+0

なぜ、AJAXはサーバー側ではありませんか? – LouwHopley

+0

解析するファイルの数はいくつですか?それは単なるファイルですか、複数ですか?大きなファイルが多数ある場合、ネットワーク上で急速に重くなる可能性があります。 – Arend

+0

この検索をページごとに1回または何回もやりたいですか?私。どのように効率的である必要がありますか? –

答えて

2

リクエストにクロスブラウザの問題があるため、これを抽象化したライブラリを使用することが賢明です。ただし、必要なコールのスケルトンがあります。

大きなファイルをjavascript変数に格納することはあまり面倒ではありません。あなたがやっていることに注意してください!

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

パーフェクト、ありがとう!私のファイルはそれほど大きくはないので、あなたの提案はそのトリックを行うだろうと思います。 – pasta

1

私があなたを正しく理解していれば、あなたはオートコンプリートが必要です。 jQueryについては、this oneをお勧めします。

0

いくつかの一般的な推奨事項:あなたはjQueryのまたは類似のライブラリを使用したくない場合は

  • は、お好みの(マイクロ)ライブラリを使用する(例えばmoo.ajax(免責事項:私はこれを使ったことがありません、保証はありません)、少なくともテキストファイルのAJAXリクエストを抽象化します。あなた自身で書くことは自明ではないと思うように誘惑されず、クロスブラウザで動くようにしてください。
  • 速度を最適化する場合は、trieまたは類似の構造体を使用して文字列を追跡します。合理的なエントロピー(すなわち、完全にランダムなデータではない)を有する10,000行については、このためのメモリ要件はうまくいきません。小さなクエリ(3文字未満など)は無視することができます。
  • メモリ使用量を最適化する場合は、配列としてメモリに文字列のリストを格納し、単純なループとindexOfまたは正規表現を使用します(/foo/.test(str)str.match(/foo/)より速いことに注意してください)。一致する文字列の
  • select要素にinnerHTML記述を使用し、<options>を生成するために文字列連結を使用してください。何千ものDOM要素を操作する方がはるかに遅くなる傾向があります。 HTMLの値を確実にエスケープし、アプリケーションで重要な場合に備えて、リスト内の選択された状態(およびスクロール位置)を失う可能性があることに注意してください。

希望に役立ちます!

関連する問題