Lucene 01 - 初步認識全文檢索和Lucene


1 搜索簡介

1.1 搜索實現方案

(1) 傳統實現方案

根據用戶輸入的關鍵詞(java), 應用服務器使用SQL語句查詢數據庫, 將查詢到的結果返回給用戶.

特點: 如果數據量很大, 用戶量大, 數據庫服務器壓力隨之增大, 導致查詢速度變慢.

(2) Lucene實現方案

根據用戶輸入的關鍵詞(java), 應用服務器通過Lucene提供的API查詢索引庫, 索引庫返回搜索結果給應用服務器, 服務器再將查詢到的結果返回給用戶

特點: 解決數據量大、用戶量大、業務系統對查詢速度要求高的業務需求(如實時查詢).

1.2 數據查詢方法

1.2.1 順序掃描法

舉例: 有多個文件A、B、C...要求找出文件內容包含有關鍵字[java]的所有文件.

順序掃描法的思路: 從A文件開始掃描查找, 再掃描B文件...一直掃描完最后一個文件, 才能得到所有包含了java內容的文件.

特點: 文件數量越多, 查找起來就很慢.

1.2.2 倒排索引法(反向索引)

舉例: 使用新華字典查找漢字, 先找到漢字的偏旁部首, 再根據偏旁部首對應的頁碼找到目標漢字.

以Lucene為例建立倒排索引:

文件一(編號是1): we like java java java

文件二(編號是2): we like Lucene Lucene Lucene

term (doc, freq) (pos)
we (1, 1) (2, 1) (0) (0)
like (1, 1) (2, 1) (1) (1)
java (1, 3) (2, 3, 4)
Lucene (2, 3) (2, 3, 4)

說明:

  • 倒排索引就是建立詞語與文件的對應關系(詞語在什么文件出現, 出現了多少次, 在什么位置出現);
  • 搜索時, 根據用戶輸入的關鍵詞, 直接在索引中進行查詢, 速度更快.

1.3 搜索技術應用場景

(1) 單機軟件搜索(Office, Eclipse...);
(2) 站內搜索(京東, 淘寶);
(3) 垂直搜索(限定行業搜索, 如: 醫療, 教育);
(4) 平台搜索(Google, 百度, 360, 搜狗).

2 Lucene簡介

2.1 Lucene是什么

Lucene官網: http://lucene.apache.org/

Lucene是Apache軟件基金會下的一個子項目, 是一個成熟、免費、開源的全文檢索引擎工具包. 它提供了一套簡單易用的API, 方便在目標系統中實現全文檢索功能. 目前已有很多應用系統的搜索功能是基於Lucene來實現, 如Eclipse幫助系統的搜索功能.

Lucene能夠為文本類型的數據建立索引, 只需要把數據轉換成文本格式, Lucene就可以對文檔進行索引和搜索. 比如常見的word文檔、html文檔、pdf文檔, 首先將文檔內容轉換成文本格式, 交給Lucene進行索引, 把建立好的索引保存在硬盤或者內存中. 然后根據用戶輸入的查詢條件, 在索引文件中查找, 將查詢結果返回給用戶.

2.2 全文檢索是什么

計算機通過索引程序掃描文章中的每一個詞, 對它們建立索引, 指明該詞在文章中出現的次數和位置. 當用戶查詢時, 檢索程序根據建立好的索引進行查找, 並將查詢結果返回給用戶.

2.3 Lucene與搜索引擎的區別

Lucene是一個用於實現全文檢索的工具類庫, 相當於汽車的發動機;

搜索引擎是基於全文檢索, 獨立運行的軟件系統, 相當於汽車.

3 全文檢索流程

3.1 索引和檢索流程圖

3.2 索引流程

(1) 原始數據

保存在關系數據庫中的數據, 存放在硬盤上的文件, 網絡上的網頁文件等都可作為原始數據.

(2) 獲取文檔

通過JDBC操作數據庫獲取關系數據庫中的數據, 通過IO操作獲取硬盤上的文件, 通過爬蟲(蜘蛛)程序獲取網絡上的網頁文件.

信息采集開源軟件

  • Solr, 是Apache的一個子項目, 是一個獨立的企業級搜索應用服務器, 對外提供類似於Web-service的API, 用戶可通過HTTP請求, 向搜索引擎服務器提交一定格式的XML文件, 也可通過HTTP的Get操作提出查詢請求, 並得到XML格式的返回結果 -- 支持從關系數據庫、xml文檔中提取原始數據.

  • Nutch, 是Apache的一個子項目, 包括大規模爬蟲工具, 能夠抓取和分辨Web網站數據.

  • jsoup, 是一款Java編寫的HTML解析器, 可直接解析某個URL地址、HTML文本內容. 它提供了一套非常省力的API, 可通過DOM, CSS以及類似於jQuery的操作方法來獲取和操作數據.

(3) 建立文檔對象

文檔(Document)對象, 相當於關系型數據庫中的一條記錄;

一個文檔對象可以包含多個域(Field), 域相當於數據庫表中的一個字段.

(4) 分析文檔取得關鍵詞

將原始數據轉換成文檔對象, 使用分析器(分詞器)對文檔對象的域中的內容切分成一個個詞語, 方便后續建立索引.

(5) 建立倒排索引

建立詞語與文檔的對應關系(詞語在什么文檔出現, 出現了多少次, 在什么位置出現), 將其保存到索引庫中.

3.3 檢索流程

(1) 用戶

用戶可以是自然人, 也可以是程序.

(2) 用戶查詢

說明: 需要為用戶提供一個輸入關鍵詞的界面, 如:

(3) 建立查詢對象

說明: 根據用戶輸入的關鍵詞, 建立查詢對象(Query), Query對象會生成查詢的語法.

如: bookName:Java, 表示查詢圖書名稱域中含有Java相關的內容.

(4) 執行查詢

說明: 根據建立的查詢對象, 以及生成的查詢語法, 在索引庫中查找目標內容, 將查詢結果返回給用戶.

(5) 返回查詢結果

說明: 提供一個友好的搜索結果顯示頁面(如對搜索結果進行排序顯示,關鍵詞高亮顯示等).

版權聲明

作者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM