上一篇文章 如何從大量 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 />"); }
搜尋結果
關鍵字 當麻
第一次: 花費時間:00:00:00.2250744
第二次: 花費時間:00:00:00.0071703
第三次: 花費時間:00:00:00.0054943
第四次: 花費時間:00:00:00.0075370
第五次: 花費時間:00:00:00.0070053
關鍵字 黃蓉
關鍵字 段譽
結論
速度變得快非常非常非常的多…從原本的 30 秒左右現在都變成只有 0.0x 秒.. 也都是在幾百毫秒內都會完成…
所以說 Lucene.net 非常強大…總算這速度,是可以跟老闆交差的速度了..
最後特別強調 :
下載範例 LuceneSearch.aspx (僅index檔案 無10萬個原始檔):