2012-10-05

[C#] 如何從大量 JSON 檔案中找尋關鍵字 (Lucene.net 篇 - 關鍵字搜尋)


上一篇文章 如何從大量 JSON 檔案中找尋關鍵字 (Lucene.net 篇 - 建立索引)
我們提到如何將十萬筆資料製作索引..
接下來我們就是對索引進行搜尋..

資料來源 (前情提要)

首先我在 Source 這檔案夾下面建立 10 萬筆資料,不多,但是也不太少,但是產生跟複製的時候足以讓我電腦 hang 住..
這資料結構長這樣
{

"Id":"4",

"Memo":"的,你快挖了丁老賊的眼珠出來,給我報仇。」蕭峰一時難以明白其間真相,目光環掃,在人君中見到了段正淳和",

"Birthday":"1900-01-05T00:00:00",

"Age":4

}




上述為了顯示好看在資料中是無分行的 JSON 資料 命名從 1~100000 所以 Id 跟檔名相同,Age 也是,至於 Memo 資料

1~50000 是從金庸小說天龍八部隨機取出 50 字,50000~100000 是從金庸小說射鵰英雄傳裡面隨機取出 50 字,做成測試資料..

所以您可以透過 段譽、蕭峰等關鍵字搜尋 您可以搜尋出 1~50000 的資料,如果是搜尋 郭靖、黃蓉、洪七公 你會搜尋到 50001~100000 的資料

我在 1,1199,49999,99999 的 Memo 欄位中都加上了當麻的字樣,方便我進行測試…因為上篇文章

如何從大量 JSON 檔案中找尋關鍵字 (Lucene.net 篇 - 建立索引) 已經將索引檔建置在專案下的 Index1 檔案夾裡面..

所以此下載檔案已經沒有那十萬筆資料的原始檔案

 

透過 Lucene 進行搜尋


C# Code:


// 啟用監看

Stopwatch sw = new Stopwatch();

sw.Start();

List<string> res = new List<string>();



// 讀取索引

string indexPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "\\Index1\\";



DirectoryInfo dirInfo = new DirectoryInfo(indexPath);

FSDirectory dir = FSDirectory.Open(dirInfo);

IndexSearcher search = new IndexSearcher(dir, true);



// 針對 Memo 欄位進行搜尋

QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Memo", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));



// 搜尋的關鍵字

Query query = parser.Parse(txtKeyword.Text);



// 開使搜尋

var hits = search.Search(query);

sw.Stop();



Response.Write("花費時間:" + sw.Elapsed + "<br /><hr />");

Response.Write("資料比數:" + hits.Length() + "<br /><hr />");

Response.Write("Result:<br />");

for (int i = 0; i < hits.Length(); i++)

{

    Response.Write("Id:" + hits.Doc(i).GetField("Id").StringValue() + "  Memo=" + hits.Doc(i).GetField("Memo").StringValue().Replace(txtKeyword.Text, "<span style='color:red'>" + txtKeyword.Text + "</span>") + "<br />");

}



搜尋結果


關鍵字 當麻

sshot-26_2



第一次: 花費時間:00:00:00.2250744
第二次: 花費時間:00:00:00.0071703
第三次: 花費時間:00:00:00.0054943
第四次: 花費時間:00:00:00.0075370
第五次: 花費時間:00:00:00.0070053



關鍵字 黃蓉



sshot-28_2



關鍵字 段譽



sshot-29_2



結論




速度變得快非常非常非常的多…從原本的 30 秒左右現在都變成只有 0.0x 秒.. 也都是在幾百毫秒內都會完成…

所以說 Lucene.net 非常強大…總算這速度,是可以跟老闆交差的速度了..



最後特別強調 :

20091213_7603ed814ea10fa6874dc5j88ho5hZqp_2

下載範例 LuceneSearch.aspx (僅index檔案 無10萬個原始檔):