2011-06-06 74 views
1

我想用javascript製作一個簡單的搜索引擎。這個想法是讀取一個服務器端的文本文件,解析它,並找到任何匹配用戶查詢的表達式。 是的,我必須使用客戶端腳本。簡單的搜索引擎與JavaScript。任何建議?

你有什麼建議嗎?

謝謝 。

編輯 - 詳細回答評論

我需要解析1個單個文件(最大10.000線)。我不需要自動完成:我只想在SELECT元素中顯示匹配查詢的字符串。另外,如果可能的話,我想避免使用JQuery。

+0

爲什麼不AJAX和做它的服務器端? – LouwHopley 2011-06-06 10:20:44

+0

你需要解析多少個文件?它只是一個文件,還是多個?如果有很多大文件,它可能會很快在網絡上變得沉重。 – Arend 2011-06-06 10:20:51

+0

你想每頁做一次或多次搜索嗎?即它需要多高效? – 2011-06-06 12:05:29

回答

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 2011-06-06 12:27:56

1

如果我正確地理解了你,你需要自動完成。對於jQuery,我可以推薦this one

0

一些一般性的建議:

  • 如果你不想使用jQuery或類似的庫,使用您所選擇的(微)庫(如moo.ajax(免責聲明:我從來沒有用過這個,沒有保證,yada yada))至少抽象了文本文件的AJAX請求。不要試圖認爲編寫自己的代碼是微不足道的,並讓它跨瀏覽器工作。
  • 如果您想優化速度,請使用trie或類似結構來跟蹤字符串。對於具有合理熵的10,000條線(即不是完全隨機的數據),有希望的內存要求不成問題。您可能希望忽略小的查詢(即少於3個字符等)。
  • 如果要優化內存使用情況,只需將內存中的字符串列表存儲爲數組,並使用簡單的循環和indexOf或正則表達式(記住/foo/.test(str)str.match(/foo/)更快!)測試以獲取列表的匹配字符串。
  • 在select元素上使用innerHTML寫入,並使用字符串連接生成<options>。操縱數千個DOM元素往往要慢得多。確保HTML轉義這些值,並且要注意,如果這對於您的應用程序很重要,您可能會失去列表中的選定狀態(和滾動位置)。

希望幫助!