[全文檢索]Lucene基礎入門.


[全文檢索]Lucene基礎入門.

本打算直接來學習Solr, 如今先把Lucene的只是捋一遍.
本文內容:
html

一、 搜索引擎的發展java

二、 Lucene入門算法

三、 Lucene的API詳解數據庫

四、 索引調優apache

五、 Lucene搜索結果排名規則api

搜索引擎的發展史

1.1 搜索引擎的發展史

萌芽Archie、Gopher緩存

起步Robot(網絡機器人)spider網絡爬蟲)服務器

一、 Robot網絡機器人,自動在網絡中運行,完成特定任務的程序如刷票器、搶票軟件等。微信

二、 spider網絡爬蟲一中特殊的機器人,抓取下載分析網絡資源,包括網頁裏面的超鏈、圖片、數據庫、音頻、視頻等資源信息。網絡

發展excitegalaxyyahoo

繁榮infoseekaltavistaGoogle、百度

 

 

1.2 搜索引擎的原理

1.2.1 信息檢索過程

一、 構建文本庫

二、 創建索引

三、 進行搜索

四、 結果進行排序

1.2.2 原理

wpsFC1C.tmp 

 

搜索引擎的工做原理經過用戶輸入信息,經過網絡爬蟲搜索服務器,將與之相關的網站信息抓取並存放到本身的數據服務器中,在存入數據服務器的過程中將這些數據信息須要建立索引庫用戶查詢的結果信息都是來源與索引庫信息,若是點擊該結果超連接則訪問的是該網站信息,若是選擇「快照訪問的是緩存信息

爲何要創建索引庫呢?創建索引庫的過程就是將該結果創建索引,通俗一點的理解就是創建目錄的過程

1.3 搜索引擎的使用場景

1.3.1 使用場景

一、 電商網站的搜索,京東、天貓等

二、 論壇、BBS等站內搜索

三、 垂直領域的搜索,垂直領域即專門作一件事。818工做網、拉勾網等都屬於垂直領域。

四、 Windows資源管理器中的搜索

五、 Word中的Ctrl+Feclipse中的Ctrl+shift+T等單機軟件的搜索

這些都是屬於信息檢索的範圍

1.3.2 倒排索引

倒排索引,就是提取信息並創建索引(目錄)的過程當中,搜索時,根據關鍵字找到資源的具體位置。如

wpsFC2C.tmp 

Lucene入門

2.1 什麼Lucene

2.1.1 概念

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

2.1.2 Lucene與搜索引擎的區別

全文檢索系統是按照全文檢索理論創建起來的用於提供全文檢索服務的軟件系統。全文檢索系統是一個能夠運行的系統,包括創建索引、處理查詢返回結果集、增長索引、優化索引結構等功能。例如:百度搜索、eclipse幫助搜索、淘寶網商品搜索。

搜索引擎是全文檢索技術最主要的一個應用,例如百度。搜索引擎起源於傳統的信息全文檢索理論,即計算機程序經過掃描每一篇文章中的每個詞,創建以詞爲單位的倒排文件,檢索程序根據檢索詞在每一篇文章中出現的頻率和每個檢索詞在一篇文章中出現的機率,對包含這些檢索詞的文章進行排序,最後輸出排序的結果。全文檢索技術是搜索引擎的核心支撐技術。

Lucene和搜索引擎不一樣,Lucene是一套用java或其它語言寫的全文檢索的工具包,爲應用程序提供了不少個api接口去調用,能夠簡單理解爲是一套實現全文檢索的類庫,搜索引擎是一個全文檢索系統,它是一個單獨運行的軟件系統。

Lucene開源免費,既不是搜索引擎不是可直接運行的軟件只是一套API,能夠根據該API開發本身的搜索系統。

 

2.2 掌握什麼

這裏咱們使用的是Lucene4.x版本,咱們須要知道是如何建立索引的,並根據輸入的信息將咱們的結果查詢出來這樣的一套流程。

2.3 企業中如何使用Lucene

例如BBS貼吧站內搜索,它是如何完成的呢?難道是查詢數據庫的信並將結果返回的麼?

wpsFC2D.tmp 

2.4 入門程序

2.4.1 下載Lucene

官網http://lucene.apache.org/咱們經過官網下載咱們須要的jar包。目前最新的版本5.3.1,那這裏咱們使用的是4.10.2這個版本

wpsFC2E.tmp 

2.4.2 建立索引

2.4.2.1 導入jar

解壓咱們的zip壓縮文件,導入咱們須要的jar。這裏咱們須要分詞器的包、Lucene的核心包、高亮顯示的包查詢須要的包。

wpsFC2F.tmp 

2.4.2.2 建立索引

在發帖提交時,咱們建立帖子的索引庫。

建立索引庫的過程:將文本內容-à轉換Document對象(對象中有不少Field能夠把該Document對象當作是一個帖子),而後在經過IndexWriter建立咱們的索引

wpsFC30.tmp 

2.4.2.2.1 代碼

wpsFC31.tmp 

 

代碼提到了分詞器的概念,這個將API的時候在細說。

2.4.2.2.2 索引

wpsFC32.tmp 

2.4.2.3 查看索引

咱們經過lukeall工具查看建立的索引庫中的內容。咱們經過java –jar xxx.jar的方式運行咱們的lukeall工具並經過該工具查看咱們建立的索引庫的內結構。

2.4.2.3.1 overview

目錄庫,分詞後的詞條信息。

wpsFC33.tmp 

2.4.2.3.2 document

也就是內容庫。存放數據的。

wpsFC44.tmp 

2.4.3 基於索引搜索

2.4.3.1 檢索過程

wpsFC45.tmp 

檢索過程

2.4.3.2 代碼

wpsFC46.tmp 

Lucene API詳解

3.1 建立索引API

wpsFC47.tmp 

3.1.1 Directory

Directory的是文件磁盤的索引路徑

RAMDirectory,指的是內存索引路徑

3.1.2 Analyzer

3.1.2.1 原理

Analyzer是一個抽象類,在Lucene的lucene-analyzers-common包中提供了不少分析器,好比:org.apache.lucene.analysis.standard.standardAnalyzer標準分詞器,它是Lucene的核心分詞器,它對分析文本進行分詞、大寫轉成小寫、去除停用詞、去除標點符號等操做過程。

什麼是停用詞?停用詞是爲節省存儲空間和提升搜索效率,搜索引擎在索引頁面或處理搜索請求時會自動忽略某些字或詞,這些字或詞即被稱爲Stop Words(停用詞)。好比語氣助詞、副詞、介詞、鏈接詞等,一般自身並沒有明確的意義,只有將其放入一個完整的句子中才有必定做用,如常見的「的」、「在」、「是」、「啊」等。

以下是org.apache.lucene.analysis.standard.standardAnalyzer的部分源碼:

final StandardTokenizer src = new StandardTokenizer(getVersion(), reader);//建立分詞器

src.setMaxTokenLength(maxTokenLength);

TokenStream tok = new StandardFilter(getVersion(), src);//建立標準分詞過濾器

tok = new LowerCaseFilter(getVersion(), tok);//在標準分詞過濾器的基礎上加大小寫轉換過濾

tok = new StopFilter(getVersion(), tok, stopwords);//在上邊過濾器基礎上加停用詞過濾

3.1.2.2 中文分詞器

學過英文的都知道,英文是以單詞爲單位的,單詞與單詞之間以空格或者逗號句號隔開。而中文則以字爲單位,字又組成詞,字和詞再組成句子。因此對於英文,咱們能夠簡單以空格判斷某個字符串是否爲一個單詞,好比I love China,love 和 China很容易被程序區分開來;但中文「我愛中國」就不同了,電腦不知道「中國」是一個詞語仍是「愛中」是一個詞語。把中文的句子切分紅有意義的詞,就是中文分詞,也稱切詞。我愛中國,分詞的結果是:我 愛 中國。

3.1.2.3 Lucene自帶分詞器

StandardAnalyzer

單字分詞:就是按照中文一個字一個字地進行分詞。如:「我愛中國
效果:「我」、「
、「中」、「國」

CJKAnalyzer

二分法分詞:按兩個字進行切分。如:「中國人」,效果:「我、「中」、「中國」「國人」

上面兩個分詞器沒法知足需求。

SmartChineseAnalyzer

對中文支持較好,但擴展性差,擴展詞庫,禁用詞庫和同義詞庫等很差處理

3.1.2.4 第三方產品

名稱

最近更新

速度 ( 網上情報 )

擴展性支持、其它

mmseg4j

2013

complex 60W  /s (1200 KB/s)

simple 100W  /s (1900 KB/s)

使用 sougou 詞庫,也可自定義

(complex\simple\ MaxWord)

IKAnalyzer

2012

IK2012 160W  /s (3000KB/s)

支持用戶詞典擴展定義、支持自定義中止詞

智能 \ 細粒度 )

Ansj

2014

BaseAnalysis 300W  /s

hlAnalysis 40W  /s

支持用戶自定義詞典,能夠分析出詞性,有新詞發現功能

paoding

2008

100W  /s

支持不限制個數的用戶自定義詞庫

 

這裏咱們使用IK分詞器。如何使用IK分詞器呢?

 

一、 解壓壓縮文件,並將該兩個配置文件放入src中。

wpsFC48.tmp 

二、 導入jar

wpsFC49.tmp 

導入FF_u1的jar包,該版本支持4.x,而u6僅僅支持4.x以前的版本。

三、 使用該分詞器的先後對比

standardanalyzer

wpsFC4A.tmp 

IKanalyzer 

wpsFC4B.tmp 

3.1.3 IndexableFiled

wpsFC4C.tmp 

LongField,分詞有多個詞條

StringField,創建索引不分詞,該內容做爲一個完的詞條Term

wpsFC4D.tmp 

TextField,創建索引時分詞,有多個詞條

Store:YESNO不影響是否分詞YES會在Document中存儲NO,不會在Document中存儲

wpsFC5D.tmp 

wpsFC5E.tmp 

3.1.4 IndexWriter

Lucene3.5以後,IndexWriter的初始化有了一個IndexConfig來做爲其初始化的參數,當咱們在使用IndexWrier的時候必定要注意在最後把writer關閉,不然拋出異常。其實這個異常是由於lucene進入到索引目錄中,發現裏面就是一個write.lock。而IndexWriter的構造函數在試圖獲取另一個IndexWriter已經加鎖的索引目錄時就會拋出一個LockObtainFailedException

IndexWriter在初始化索引的時候會爲這個索引加鎖,等到初始化完成以後會調用其close()方法關閉IndexWriter,在close()這個方法的內部其實也是調用了unlock()來釋放鎖,當程序結束後IndexWriter沒有正常關閉的時候這個鎖也就沒有被釋放,等待下次對一樣的索引文件建立IndexWriter的時候就會拋出該異常。

wpsFC5F.tmp 

執行上面代碼,就會報以下錯誤

 

wpsFC60.tmp 

 

編寫工具類,在使用完IndexWriter自動關閉

 

通俗一點講:就是該對象銷燬後才釋放鎖對象,由於都是信息放入同一個索引庫中。若是指定不是一索引庫是沒有問題的,可是須要執行commit方法,由於close方法中包含了commit方法

wpsFC61.tmp 

 

3.2 基於索引檢索API

wpsFC62.tmp 

 

檢索最重要的就是根據你的Query去搜索信息,所以咱們Lucene的API中提供了不少的Query對象,咱們根據不一樣的Query對象獨有的特性去檢索咱們須要的信息。

3.2.1 QueryParser

針對單一字段解析查詢信息分詞進行搜索。

wpsFC63.tmp 

3.2.2 MultiFiledQueryParser

針對多字段,解析查詢信息並分詞進行搜索。

wpsFC64.tmp 

3.2.3 TermQuery

根據詞條搜索,使用該對象不會在去解析查詢信息並分詞。詞條就是索引庫的最小單位不可再繼續分詞

wpsFC65.tmp 

3.2.4 WildcardQuery

模糊搜索*表明0或多個字符;表明一個字符

wpsFC66.tmp 

3.2.5 FuzzyQuery

類似度搜索,例如,咱們想搜JQuery,可是在輸入框輸入jquary

 

wpsFC67.tmp 

 

FuzzyQuery構造方法:

wpsFC68.tmp 

FuzzyQuery(Term term):默認支持模糊字數爲2

FuzzyQuery(Term term, int maxEdits)maxEdits模糊字數,[0,2]之間,若爲0,至關於TermQuery

FuzzyQuery(Term term, int maxEdits, int prefixLength)prefixLength指定多個前綴字母必須徹底匹配。

wpsFC69.tmp 

3.2.6 NumericRangeQuery

數字範圍搜索(演示最後兩個參數的含義是:minInclusive,是否最小包含maxInclusive是否最大包含

wpsFC7A.tmp 

3.2.7 MatchAllDocsQuery

查詢全部的結果

wpsFC7B.tmp 

3.2.8 小結

使用Query對象的優先順序

一、 TermQuery,詞條搜索

二、 輸入內容太長,可用:QueryParser,將輸入內容解析並切詞

三、 輸入內容太短,:WildcardQuery模糊查詢

四、 輸入內容有誤,可用:FuzzyQuery類似度查詢

3.3 BooleanQuery

BooleanQuery組合查詢,經過該Query對象能夠將上面各類Query進行任意組合。

構造方法:

wpsFC7C.tmp 

add(Query query, BooleanClause.Occur occur)query各類其餘的queryoccur,該變量的取值有三種,分別爲:MUST(必須知足)、MUST_NOT(必須不知足)、SHOULD(能夠知足

MUST+MUST:兩個Query查詢對象的交集

MUST+MUST_NOT兩個Query查詢對象的補集

SHOULD+SHOULD:兩個Query查詢對象的集。

wpsFC7D.tmp 

3.4 結論

詞條:就是將查詢的信息經過指定的各類Query對象自己特有的屬性去匹配詞條;

Document:就是將匹配的結果返回。

索引調優

4.1 概念

索引調優:就是在建立索引,將咱們的建立的索引庫的內容和磁盤內容加載到內存中,執行完以後,並將內存中的索引庫的內容加載到磁盤上。

RAMDirectory是內存的一個區域,當虛擬機退出後,裏面的內容也會隨之消失

RAMDirectory的性能要好於FSDirectory, 所以能夠結合使用,在虛擬機退出時,將RAM內容轉到FSDirectory

4.2 代碼

索引調優代碼:

wpsFC7E.tmp 

 

CREATE會寫到索引庫並覆蓋原索引

CREATE_OR_APPEND:將內存庫信息追加到索引庫

Lucene搜索結果排名規則

5.1 結果得分

5.1.1 Lucene文檔的得分算法

wpsFC7F.tmp 

 

idf舉例

有不少不一樣的數學公式能夠用來計算TF-IDF。這邊的例子以上述的數學公式來計算。詞頻 (TF) 是一詞語出現的次數除以該文件的總詞語數。假如一篇文件的總詞語數是100個,而詞語「母牛」出現了3次,那麼「母牛」一詞在該文件中的詞頻就是3/100=0.03。一個計算文件頻率 (DF) 的方法是測定有多少份文件出現過「母牛」一詞,而後除以文件集裏包含的文件總數。因此,若是「母牛」一詞在1,000份文件出現過,而文件總數是10,000,000份的話,其逆向文件頻率就是 lg(10,000,000 / 1,000)=4。最後的TF-IDF的分數爲0.03 * 4=0.12

5.1.2 改變boost來改變文檔得分

boost,激勵因子,默認值是1,能夠手動更改。咱們能夠設置boost值來改變搜索結果排名。並且設置boost值後,該信息保存在Document文檔的norm中。

wpsFC80.tmp 

5.1.2.1 索引庫中建立100個索引

wpsFC81.tmp 

5.1.2.2 搜索索引庫中的內容

wpsFC82.tmp 

 

查詢的結果:

wpsFC83.tmp 

並且全部的DocumentNORM的值都是同樣。

wpsFC84.tmp 

 

得分同樣。那麼我想讓第88條記錄排在第一位怎麼辦?咱們只有設置它的激勵因子(boost值便可

一、 設置得分

wpsFC85.tmp 

二、 結果

wpsFC86.tmp 

三、 NORM

wpsFC97.tmp 

 

設置boost激勵因子),能夠改變得分以及Norm值。

 

5.2 結果高亮顯示

結果高亮顯示也就是將搜索內容進行了高亮顯示。例如百度查詢java

wpsFC98.tmp 

 

因此說高亮顯示就是將搜索的信息結果經過HTML標籤進行樣式的處理。能夠標題也能夠對文本進行高亮顯示。

5.2.1 定義高亮

wpsFC99.tmp 

5.2.2 使用高亮

wpsFC9A.tmp 

5.2.3 結果顯示

wpsFC9B.tmp

分類: 全文檢索好文要頂 關注我 收藏該文  一枝花算不算浪漫

相關文章
相關標籤/搜索