1. 程式人生 > >【Lucene】全文搜尋技術

【Lucene】全文搜尋技術

大綱

 2.3 索引

1、需求分析

1.1 資料分類

我們生活中的資料總體分為兩種:結構化資料和非結構化資料。

結構化資料:指具有固定格式或有限長度的資料,如資料庫,元資料等。

非結構化資料:指不定長或無固定格式的資料,如郵件,word文件等磁碟上的檔案

1.2 非結構化資料查詢方法

1.2.1順序掃描法(Serial Scanning)

所謂順序掃描,比如要找內容包含某一個字串的檔案,就是一個文件一個文件的看,對於每一個文件,從頭看到尾,如果此文件包含此字串,則此文件為我們要找的檔案,接著看下一個檔案,直到掃描完所有的檔案。如利用

windows的搜尋也可以搜尋檔案內容,只是相當的慢。

1.2.2 全文檢索(Full-text Search)

將非結構化資料中的一部分資訊提取出來,重新組織,使其變得有一定結構,然後對此有一定結構的資料進行搜尋,從而達到搜尋相對較快的目的。這部分從非結構化資料中提取出的然後重新組織的資訊,我們稱之索引

例如:字典。字典的拼音表和部首檢字表就相當於字典的索引,對每一個字的解釋是非結構化的,如果字典沒有音節表和部首檢字表,在茫茫辭海中找一個字只能順序掃描。然而字的某些資訊可以提取出來進行結構化處理,比如讀音,就比較結構化,分聲母和韻母,分別只有幾種可以一一列舉,於是將讀音拿出來按一定的順序排列,每一項讀音都指向此字的詳細解釋的頁數。我們搜尋時按結構化的拼音搜到讀音,然後按其指向的頁數,便可找到我們的非結構化資料

——也即對字的解釋。

這種先建立索引,再對索引進行搜尋的過程就叫全文檢索(Full-text Search)。

1.3如何實現全文檢索

可以使用Lucene實現全文檢索。Lucene是apache下的一個開放原始碼的全文檢索引擎工具包。提供了完整的查詢引擎和索引引擎,部分文字分析引擎。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能。

​​​​​​​1.4 全文檢索的應用場景

對於資料量大、資料結構不固定的資料可採用全文檢索方式搜尋,比如百度、Google等搜尋引擎、論壇站內搜尋、電商網站站內搜尋等。

(1)網際網路全文檢索引擎(比如百度,  谷歌,  必應)

(2)站內全文檢索引擎(淘寶, 京東搜尋功能)

(3)優化資料庫查詢(因為資料庫中使用like關鍵字是全表掃描也就是順序掃描演算法,查詢慢)

2、Lucene shix實現全文檢索的流程

2.1 索引和搜尋的流程圖

1、綠色表示索引過程,對要搜尋的原始內容進行索引構建一個索引庫,索引過程包括:

確定原始內容即要搜尋的內容-->採集文件--->建立文件--->分析文件--->索引文件

2、紅色表示搜尋過程,從索引庫中搜索內容,搜尋過程包括:

使用者通過搜尋介面--->建立查詢--->執行搜尋,從索引庫搜尋--->渲染搜尋結果

3、獲取原始wend文件

      建立文件物件

      分析文件

      建立索引

2 Lucene 結構

 2.3 索引

域名:詞  這樣的形式,

它裡面有指標執行這個詞來源的文件

索引庫: 放索引的資料夾(這個資料夾可以自己隨意建立,在裡面放索引就是索引庫)

Term詞元: 就是一個詞, 是lucene中詞的最小單位

2.4 wend文件

Document物件,一個Document中可以有多個Field域物件,Field域物件中是key   value鍵值對的形式:有域名和域值,

一個document就是資料庫表中的一條記錄, 一個Filed域物件就是資料庫表中的一行一列

這是一個通用的儲存結構.

建立索引和所有時所用的分詞器必須一致

2.5 域的詳細介紹

是否分詞:

         分詞的作用是為了索引

         需要分詞: 檔名稱, 檔案內容

         不需要分詞: 不需要索引的域不需要分詞,還有就是分詞後無意義的域不需要分詞

                          比如: id, 身份證號

是否索引:

         索引的的目的是為了搜尋.

         需要搜尋的域就一定要建立索引,只有建立了索引才能被搜尋出來

         不需要搜尋的域可以不建立索引

         需要索引: 檔名稱, 檔案內容, id, 身份證號等

         不需要索引: 比如圖片地址不需要建立索引, e:\\xxx.jpg

                   因為根據圖片地址搜尋無意義

是否儲存:

         儲存的目的是為了顯示.

         是否儲存看個人需要,儲存就是將內容放入Document文件物件中儲存出來,會額外佔用磁碟空間, 如果搜尋的時候需要馬上顯示出來可以放入document中也就是要儲存,這樣查詢顯示速度快, 如果不是馬上立刻需要顯示出來,則不需要儲存,因為額外佔用磁碟空間不划算.

2.6 域的各種型別

Field類

資料型別

Analyzed

是否分析

Indexed

是否索引

Stored

是否儲存

說明

StringField(FieldName, FieldValue,Store.YES))

字串

N

Y

YN

這個Field用來構建一個字串Field,但是不會進行分析,會將整個串儲存在索引中,比如(訂單號,姓名等)

是否儲存在文件中用Store.YES或Store.NO決定

LongField(FieldName, FieldValue,Store.YES)

Long

Y

Y

YN

這個Field用來構建一個Long數字型Field,進行分析和索引,比如(價格)

是否儲存在文件中用Store.YES或Store.NO決定

StoredField(FieldName, FieldValue)

過載方法,支援多種型別

N

N

Y

這個Field用來構建不同型別Field

不分析,不索引,但要Field儲存在文件中

TextField(FieldName, FieldValue, Store.NO)

TextField(FieldName, reader)

字串

Y

Y

YN

如果是一個Reader, lucene猜測內容比較多,會採用Unstored的策略.

注意:lucene底層的演算法,錢數是要分詞的,因為要根據價錢進行對比

例如: 大於12.5元的小於100元的商品搜尋出來

3、 索引庫的維護

3.1  索引庫的新增

3.2 索引庫的修改

3.3 索引庫的刪除

4、 索引庫的查詢(重點)

4.1 使用query的子類查詢

4.1.1 termQuery

4.1.2 BumericRangeQuery

4.1.3 BooleanQuery

4.1.4 MatchAllDocsQuery

4.2 使用queryparser查詢

4.2.1 QueryParser

4.2.2 MultiFieldQueryParser