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) 返回查詢結果
說明: 提供一個友好的搜索結果顯示頁面(如對搜索結果進行排序顯示,關鍵詞高亮顯示等).
版權聲明
作者: 馬瘦風
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.
