Lucene簡單瞭解和使用

一,Lucene簡介算法

1 、 Lucene  是什麼?數據庫

Lucene 是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。說到底它是一個信息檢索程序庫,而不是應用產品。所以它並不像百度或者 google 那樣,拿來就能用,它只是提供了一種工具讓你能實現這些產品。apache

2 、Lucene  能作什麼?架構

要回答這個問題,先要了解 lucene 的本質。實際上 lucene 的功能很單一,說到底,就是咱們給它若干個字符串,而後它爲咱們提供一個全文搜索服務,最後告訴咱們要搜索的關鍵詞出如今哪裏。知道了這個本質,咱們就能夠發揮想象作任何符合這個條件的事情了。好比咱們能夠把站內新聞都索引了,作個資料庫;也能夠把一個數據庫表的若干個字段索引發來,那就不用再擔憂由於「%like%」而鎖表了;學完 lucene,你也能夠寫個本身的搜索引擎了……工具

3,Lucene 速度測試測試

下面給出一些測試數據,若是你以爲能夠接受,那麼能夠選擇。測試一:250 萬記錄,300M 左右文本,生成索引 380M 左右,800 線程下平均處理時間 300ms。搜索引擎

測試二:37000 記錄,索引數據庫中的兩個 varchar 字段,索引文件2.6M,800 線程下平均處理時間 1.5ms。google

二,深刻lucene開放源代碼

1 、 爲何 lucene 這麼快
一、倒排索引
二、壓縮算法
三、二元搜索線程

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

3 、 工做方式

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

4 、寫入流程

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

二、將源中須要的信息加入 Document 的各個 Field(信息域)中,並把須要索引的 Field 索引發來,把須要存儲的 Field 存儲起來。

三、將索引寫入磁盤。

5 、讀出流程

一、用戶提供搜索關鍵詞,通過 analyzer 處理。

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

三、用戶根據須要從找到的 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

 13,Field

一.Field  屬性
Field 是文檔中的域,包括 Field 名和 Field 值兩部分,一個文檔能夠包括多個 Field,Document 只是 Field 的一個承載體,Field
值即爲要索引的內容,也是要搜索的內容。

是否分詞(tokenized)
是:做分詞處理,即將 Field 值進行分詞,分詞的目的是爲了索引。
好比:商品名稱、商品簡介等,這些內容用戶要輸入關鍵字搜索,因爲搜索的內容格式大、內容多須要分詞後將語彙單元索引。
否:不做分詞處理
好比:商品 id、訂單號、身份證號等

是否索引(indexed)
是:進行索引。將 Field 分詞後的詞或整個 Field 值進行索引,索引的目的是爲了搜索。
  好比:商品名稱、商品簡介分詞後進行索引,訂單號、身份證號不用分詞但也要索引,這些未來都要做爲查詢條件。
否:不索引。該域的內容沒法搜索到
  好比:商品 id、文件路徑、圖片路徑等,不用做爲查詢條件的不用索引。

是否存儲(stored)
是:將 Field 值存儲在文檔中,存儲在文檔中的 Field 才能夠從Document 中獲取。
好比:商品名稱、訂單號,凡是未來要從 Document 中獲取的 Field都要存儲。
否:不存儲 Field 值,不存儲的 Field 沒法經過 Document 獲取
好比:商品簡介,內容較大不用存儲。若是要向用戶展現商品簡介能夠從系統的關係數據庫中獲取商品簡介。若是須要商品描述,則根據搜索出的商品 ID 去數據庫中查詢,而後
顯示出商品描述信息便可。

二.Field  經常使用類型
開發中經常使用 的 Filed 類型,注意 Field 的屬性,根據需求選擇:

三. 例子
圖書 id:
是否分詞:不用分詞,由於不會根據商品 id 來搜索商品
是否索引:不索引,由於不須要根據圖書 ID 進行搜索
是否存儲:要存儲,由於查詢結果頁面須要使用 id 這個值

圖書名稱:
是否分詞:要分詞,由於要將圖書的名稱內容分詞索引,根據關
鍵搜索圖書名稱抽取的詞。
是否索引:要索引。
是否存儲:要存儲

圖書價格:
是否分詞:要分詞,lucene 對數字型的值只要有搜索需求的都要
分詞和索引,由於 lucene 對數字型的內容要特殊分詞處理,本例
子可能要根據價格範 圍搜索,須要分詞和索引。
是否索引:要索引
是否存儲:要存儲
  圖書圖片地址:
是否分詞:不分詞
是否索引:不索引
是否存儲:要存儲
  圖書描述:
是否分詞:要分詞
是否索引:要索引
是否存儲:由於圖書描述內容量大,不在查詢結果頁面直接顯示,

不存儲。 不存儲是來不在 lucene 的索引文件中記錄,節省 lucene的索引文件空間, 若是要在詳情頁面顯示描述,思路: 從 lucene中取出圖書的 id,根據圖書的 id 查詢關係數據庫中 book 表 得到描述信息。

相關文章
相關標籤/搜索