Lucene檢索與關鍵字Like 效能對比

2021-09-08 08:58:07 字數 2707 閱讀 8537

日常開發中,相信大家經常會用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....