日常開發中,相信大家經常會用like去匹配一些資料,同時我們也知道,like往往會導致全表掃瞄,當資料量越來越大的時候,我們會糾結於
資料庫的龜速查詢,此時我們必須另尋蹊蹺,這時lucene就可以大顯身手了。
首先我們做乙個demo,向資料庫中插入10w條資料,總共778m。
接下來,我們搜尋下新聞內容中包含「流行」的記錄。
mmd,檢索一下要78s,是誰都要砸了面前的破機子。
1 using system;2 using system.collections.generic;
3 using system.linq;
4 using system.text;
5 using lucene.net.index;
6 using lucene.net.store;
7 using lucene.net.analysis.standard;
8 using lucene.net.documents;
9 using system.data;
10 using system.diagnostics;
11 using lucene.net.search;
12 13 using lucene.net.queryparsers;
14 15 namespace first
16 ", hits.doc(i).get("content").substring(0, 20) + "...");
40 }
41 42 watch.stop();
43 45 }
46 47 static void createindex()
48
69 70 reader.close();
71 72 //對索引檔案進行優化
我靠,448ms,頓時78s黯然失色,當然這個時間是不包含"建立索引「的時間,從時間複雜度上來說,這種預載入索引算是常量。
作為入門,簡單的介紹下lucene的實現過程,首先lucene主要分成兩步:"索引"和"搜尋"。
一:索引:
相信大家對索引還是比較熟悉的,lucene能夠將我們內容切分成很多詞,然後將詞作為key,建立「倒排索引」,然後放到索引庫中,在上面
的例子中,我們看到了索引過程中使用到了indexwriter,fsdirectory,standardanalyzer,document和field這些類,下面簡要分析下。
1:indexwriter
我們看到該類有乙個adddocument方法,所以我們認為該類實現了索引的寫入操作。
2:fsdirectory
這個就更簡單了,提供了索引庫的存放位置,比如我們這裡的d:\sample,或許有人問,能不能存放在記憶體中,在強大的lucene面前當然
可以做到,lucene中的ramdirectory就可以實現,當然我們的記憶體足夠大的話,還是可以用記憶體承載索引庫,進而提高搜尋的效率。
3:standardanalyzer
這個算是索引過程中最最關鍵的一步,也是我們使用lucene非常慎重考慮的東西,之所以我們能搜尋秒殺,關鍵在於我們如何將輸入的內容
進行何種形式的切分,當然不同的切分形式誕生了不同的分析器,standardanalyzer就是乙個按照單字分詞的一種分析器,詳細的介紹後續文
章分享。
4:document
在上面的例子可以看到,他是承載field的集合,然後新增到indexwriter中,有點類似表中的行的概念。
5: field
提供了對要分析的字段進行何種處理,以kv形式呈現。
①:field.store.yes, field.index.not_analyzed 表示對索引字段採取:原樣儲存並且不被standardanalyzer進行切分。
②: field.store.no, field.index.analyzed 不儲存但是要被standardanalyzer切分。
二:搜尋
這個比較容易,根據我們輸入的詞lucene能夠在索引庫中快速定位到我們要找的詞,同樣我們可以看到indexsearcher,queryparser,hits。
1:indexsearcher
這個我們可以理解成以唯讀的形式開啟由indexwriter建立的索引庫,search給queryparser提供了查詢的橋梁。
2:queryparser
這玩意提供了乙個parse方法能夠將我們要查詢的詞轉化為lucene能夠理解了查詢表示式。
3:hits
這個就是獲取匹配結果的乙個指標,優點類似c#中的延遲載入,目的都是一樣,提高效能。
Lucene檢索與關鍵字Like 效能對比
日常開發中,相信大家經常會用like去匹配一些資料,同時我們也知道,like往往會導致全表掃瞄,當資料量越來越大的時候,我們會糾結於 資料庫的龜速查詢,此時我們必須另尋蹊蹺,這時lucene就可以大顯身手了。首先我們做乙個demo,向資料庫中插入10w條資料,總共778m。接下來,我們搜尋下新聞內容...
lucene 關鍵字高亮
indexwriter writer new indexwriter indexpath,analyzer,true document doca new document string filetexta 因為火燒雲總是燃燒著消失在太陽衝下地平線的時刻,然後便是寧靜的自然的天籟,沒有誰會在這樣的時光...
利用lucene對檔案內容進行關鍵字檢索
一 概述 二 例項講解 在具體實現之前,請根據自己的要求,建立對應的路徑及檔案。例如,我這邊建立的路徑及檔案是 d tools learningbymyself lucene source demo1.txt d tools learningbymyself lucene source demo2....