1. 程式人生 > >Lucene簡單瞭解和使用

Lucene簡單瞭解和使用

一,Lucene簡介

1 、 Lucene  是什麼?

Lucene 是一個開放原始碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎。說到底它是一個資訊檢索程式庫,而不是應用產品。因此它並不像百度或者 google 那樣,拿來就能用,它只是提供了一種工具讓你能實現這些產品。

2 、Lucene  能做什麼?

要回答這個問題,先要了解 lucene 的本質。實際上 lucene 的功能很單一,說到底,就是我們給它若干個字串,然後它為我們提供一個全文搜尋服務,最後告訴我們要搜尋的關鍵詞出現在哪裡。知道了這個本質,我們就可以發揮想象做任何符合這個條件的事情了。比如我們可以把站內新聞都索引了,做個資料庫;也可以把一個數據庫表的若干個欄位索引起來,那就不用再擔心因為“%like%”而鎖表了;學完 lucene,你也可以寫個自己的搜尋引擎了……

3,Lucene 速度測試

下面給出一些測試資料,如果你覺得可以接受,那麼可以選擇。測試一:250 萬記錄,300M 左右文字,生成索引 380M 左右,800 執行緒下平均處理時間 300ms。

測試二:37000 記錄,索引資料庫中的兩個 varchar 欄位,索引檔案2.6M,800 執行緒下平均處理時間 1.5ms。

二,深入lucene

1 、 為什麼 lucene 這麼快
1、倒排索引
2、壓縮演算法
3、二元搜尋

2 、倒排序索引它是根據屬性的值來查詢記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(invertedindex)。

3 、 工作方式

Lucene 提供的服務實際包含兩部分:一入一出。所謂入是寫入,即將你提供的源(本質是字串)寫入索引或者將其從索引中刪除;所謂出是讀出,即向用戶提供全文搜尋服務,讓使用者可以通過關鍵詞定位源。

4 、寫入流程

1、源字串首先經過 analyzer 處理,包括:分詞,分成一個個單詞;去除 stopword(可選)。

2、將源中需要的資訊加入 Document 的各個 Field(資訊域)中,並把需要索引的 Field 索引起來,把需要儲存的 Field 儲存起來。

3、將索引寫入磁碟。

5 、讀出流程

1、使用者提供搜尋關鍵詞,經過 analyzer 處理。

2、對處理後的關鍵詞搜尋它的索引,找出對應的 Document。

3、使用者根據需要從找到的 Document 中提取需要的 Field。

6 、Docement

使用者提供的源是一條條記錄,它們可以是文字檔案、字串或者資料庫表的一條記錄等等。一條記錄經過索引之後,就是以一個Document 的形式儲存在索引檔案中的。使用者進行搜尋,也是以Document 列表的形式返回。

7 、Field
一個 Document 可以包含多個資訊域,例如一篇文章可以包含“標題”、“正文”、“最後修改時間”等資訊域,這些資訊域就是通過 Field在 Document 中儲存的。Field 有兩個屬性可選:儲存和索引。通過儲存屬性你可以控制是否對這個 Field 進行儲存;通過索引屬性你可以控制是否對該Field 進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正
確組合很重要。

8 、 實現原理

Lucene 整體使用如圖所示:

9 、環境配置
下載 lucene jar
官網:https://lucene.apache.org/
匯入 jar 到專案中

10 、建立索引

11 、查詢索引

12 、其他功能

12.1 分詞器

Lucene 自帶的 StandardAnalyzer 分詞器,只能對英語進行分詞。在對中文進行分詞的時候採用了一元分詞,即每一箇中文作為一個詞,如“我是中國人”,則分詞結果為“我”,“是”,“中”,“國”,“人”,可以看出分詞效果很差。在這裡推薦一個比較好用的中文分詞器IKAnalyzer。

12.2 停用詞

停用詞是指在資訊檢索中,為節省儲存空間和提高搜尋效率,在處理自然語言資料(或文字)之前或之後會自動過濾掉某些字或詞,這些字或詞即被稱為 Stop Words(停用詞)。比如中文中“了”, “麼”,“呢”,“的”等意義不大且在一篇文章中出現頻率又很高的詞,又比

如英文中的”for”,”in”,”it”,”a”,”or”等詞。在使用 IKAnalyzer 分詞器的時候,可以在 IKAnalyzer.cfg.xml裡配置相關資訊,如下圖:

12.3  高亮-Highlighter