全文檢索技術(shù)被廣泛的應(yīng)用于搜索引擎海渊,查詢檢索等領(lǐng)域痊班。我們?cè)诰W(wǎng)絡(luò)上的大部分搜索服務(wù)都用到了全文檢索技術(shù)勤婚。
對(duì)于數(shù)據(jù)量大、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索涤伐,比如百度馒胆、Google等搜索引擎荆永、論壇站內(nèi)搜索、電商網(wǎng)站站內(nèi)搜索等。
什么是全文檢索呢髓削?先看一下百度百科的專業(yè)定義侦锯。
為了能更好的理解,我們先看一個(gè)簡(jiǎn)單的例子骂删。
案例
實(shí)現(xiàn)一個(gè)文件的搜索功能,通過關(guān)鍵字搜索文件四啰,凡是文件名或文件內(nèi)容包括關(guān)鍵字的文件都需要找出來宁玫。還可以根據(jù)中文詞語進(jìn)行查詢,并且需要支持多個(gè)條件查詢柑晒。
本案例中的原始內(nèi)容就是磁盤上的一些示例文件欧瘪,如下圖:
如果用數(shù)據(jù)庫(kù)實(shí)現(xiàn)的話,數(shù)據(jù)庫(kù)中的搜索很容易實(shí)現(xiàn)匙赞,通常都是使用sql語句進(jìn)行查詢佛掖,而且能很快的得到查詢結(jié)果。
為什么數(shù)據(jù)庫(kù)搜索很容易涌庭?
因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)存儲(chǔ)是有規(guī)律的芥被,有行有列而且數(shù)據(jù)格式、數(shù)據(jù)長(zhǎng)度都是固定的坐榆。
但是拴魄,我們生活中的數(shù)據(jù)總體是分為兩種的:結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。
結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限長(zhǎng)度的數(shù)據(jù)席镀,如數(shù)據(jù)庫(kù)匹中,元數(shù)據(jù)等。
非結(jié)構(gòu)化數(shù)據(jù):指不定長(zhǎng)或無固定格式的數(shù)據(jù)豪诲,如郵件顶捷,word文檔等磁盤上的文件
結(jié)構(gòu)化數(shù)據(jù)的查詢我們可以通過sql搞定,那么非結(jié)構(gòu)化的呢跛溉?
非結(jié)構(gòu)化數(shù)據(jù)的查詢方法
非結(jié)構(gòu)化數(shù)據(jù)查詢有兩種辦法:
(1)順序掃描法(Serial Scanning)
所謂順序掃描焊切,比如要找內(nèi)容包含某一個(gè)字符串的文件,就是一個(gè)文檔一個(gè)文檔的看芳室,對(duì)于每一個(gè)文檔专肪,從頭看到尾,如果此文檔包含此字符串堪侯,則此文檔為我們要找的文件嚎尤,接著看下一個(gè)文件,直到掃描完所有的文件伍宦。如利用windows的搜索也可以搜索文件內(nèi)容芽死,只是相當(dāng)?shù)穆?/p>
(2)全文檢索(Full-text Search)
將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來乏梁,重新組織,使其變得有一定結(jié)構(gòu)关贵,然后對(duì)此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索遇骑,從而達(dá)到搜索相對(duì)較快的目的。這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息揖曾,我們稱之索引落萎。
例如:字典。字典的拼音表和部首檢字表就相當(dāng)于字典的索引炭剪,對(duì)每一個(gè)字的解釋是非結(jié)構(gòu)化的练链,如果字典沒有音節(jié)表和部首檢字表,在茫茫辭海中找一個(gè)字只能順序掃描奴拦。然而字的某些信息可以提取出來進(jìn)行結(jié)構(gòu)化處理媒鼓,比如讀音,就比較結(jié)構(gòu)化错妖,分聲母和韻母绿鸣,分別只有幾種可以一一列舉,于是將讀音拿出來按一定的順序排列站玄,每一項(xiàng)讀音都指向此字的詳細(xì)解釋的頁數(shù)枚驻。我們搜索時(shí)按結(jié)構(gòu)化的拼音搜到讀音濒旦,然后按其指向的頁數(shù)株旷,便可找到我們的非結(jié)構(gòu)化數(shù)據(jù)——也即對(duì)字的解釋。
這種先建立索引尔邓,再對(duì)索引進(jìn)行搜索的過程就叫全文檢索(Full-text Search)晾剖。
雖然創(chuàng)建索引的過程也是非常耗時(shí)的,但是索引一旦創(chuàng)建就可以多次使用梯嗽,全文檢索主要處理的是查詢齿尽,所以耗時(shí)間創(chuàng)建索引是值得的。
那么如何實(shí)現(xiàn)全文檢索呢灯节?
Lucene
提到全文檢索循头,不得不提到的一個(gè)技術(shù)就是Lucene,Lucene是apache下的一個(gè)開放源代碼的全文檢索引擎工具包炎疆。提供了完整的查詢引擎和索引引擎卡骂,部分文本分析引擎。我們所熟知的全文檢索引擎Solr和ES都是基于Lucene的形入。
- 綠色表示索引過程全跨,對(duì)要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個(gè)索引庫(kù),索引過程包括:
確定原始內(nèi)容即要搜索的內(nèi)容->采集文檔->創(chuàng)建文檔->分析文檔->索引文檔
- 紅色表示搜索過程亿遂,從索引庫(kù)中搜索內(nèi)容浓若,搜索過程包括:
用戶通過搜索界面->創(chuàng)建查詢->執(zhí)行搜索渺杉,從索引庫(kù)搜索->渲染搜索結(jié)果
創(chuàng)建索引
也就是對(duì)文檔索引的過程,將用戶要搜索的文檔內(nèi)容進(jìn)行索引挪钓,索引存儲(chǔ)在索引庫(kù)(index)中是越。
比如剛才的這些文檔:
我們要分析其中所有的單詞,將單詞碌上、文檔名建立映射關(guān)系英妓。
(對(duì)于單詞的切分包括了對(duì)原始文檔提取單詞、去除停用詞等過程绍赛,這個(gè)過程被稱為分詞)
我們分析其中的一篇文檔Lucene.txt:
原文檔內(nèi)容:
Lucene is a Java full-text search engine. Lucene is not a complete
application, but rather a code library and API that can easily be used
to add search capabilities to applications.
我們可以分析后得到語匯單元:
lucene蔓纠、java、full吗蚌、search腿倚、engine。蚯妇。敷燎。。
另一個(gè)文檔flink.txt加入幾個(gè)單詞:
java flink kakfa
我們也可以得到語匯單元:
java flink kakfa
這樣我們就建立了映射關(guān)系箩言,lucene硬贯、java、full陨收、search在Lucene.txt中饭豹,而flink不在Lucene.txt中,但是在flink.txt中务漩。java即在Lucene.txt中拄衰,也在flink.txt中。
那當(dāng)我們查找lucene這個(gè)詞饵骨,就在Lucene.txt中翘悉,但是查找java時(shí)可以獲悉其在這兩個(gè)文件中。
創(chuàng)建索引是對(duì)語匯單元索引居触,通過詞語找文檔妖混,這種索引的結(jié)構(gòu)就叫做叫倒排索引結(jié)構(gòu)。
傳統(tǒng)方法是根據(jù)文件找到該文件的內(nèi)容轮洋,在文件內(nèi)容中匹配搜索關(guān)鍵字制市,這種方法是順序掃描方法,數(shù)據(jù)量大砖瞧、搜索慢息堂。
倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞語)找文檔,如下圖:
倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu),包括索引和文檔兩部分荣堰,索引即詞匯表床未,它的規(guī)模較小,而文檔集合較大振坚。
有倒排索引薇搁,對(duì)應(yīng)肯定,有正向索引渡八。正向索引其實(shí)就是順序掃描所有文件啃洋,這樣本身效率是極低的。
查詢索引
查詢索引也是搜索的過程屎鳍。搜索就是用戶輸入關(guān)鍵字宏娄,從索引(index)中進(jìn)行搜索的過程。根據(jù)關(guān)鍵字搜索索引逮壁,根據(jù)索引找到對(duì)應(yīng)的文檔孵坚,從而找到要搜索的內(nèi)容(這里指磁盤上的文件)。
我們這里就是通過查詢索引表窥淆,找到文檔所在的位置卖宠,就完成了查詢,但其他的場(chǎng)景可以靈活的把查詢出來的結(jié)果展示出去忧饭,比如我們的百度搜索時(shí)扛伍,為我們展示的是相關(guān)網(wǎng)頁。
開發(fā)一個(gè)自己的全文檢索
手動(dòng)去開發(fā)建立索引和查詢索引的功能需要大量的工作词裤,好在lucene已經(jīng)幫我們完成了大量的工作刺洒,只需要調(diào)用java api就可以完成相關(guān)工作。
但是Lucene的API過于底層亚斋,并不簡(jiǎn)單易用作媚,而且缺乏企業(yè)級(jí)的管理工具對(duì)其進(jìn)行監(jiān)控管理,于是企業(yè)級(jí)的全文檢索引擎就應(yīng)運(yùn)而生了帅刊,目前最流行的兩個(gè)就是:Solr和ES。他們都是建立在Lucene之上的漂问。
Solr
Solr是Apache Lucene項(xiàng)目的開源企業(yè)搜索平臺(tái)赖瞒。Solr是高度可擴(kuò)展的,并提供了分布式搜索和索引復(fù)制蚤假。
Solr由Java開發(fā)栏饮,運(yùn)行在Servlet容器中,是一個(gè)獨(dú)立的全文搜索服務(wù)器磷仰。并具有強(qiáng)大的API和外部配置功能袍嬉,使得無需編碼,便可對(duì)其調(diào)整以適應(yīng)多種類型應(yīng)用。
2010年Apache Lucene與Apache Solr項(xiàng)目合并伺通,所以Lucene/Solr成為了Apache一個(gè)項(xiàng)目箍土。
由此可見,Solr的優(yōu)勢(shì)就是:
有一個(gè)成熟的開發(fā)者社區(qū);本省比較穩(wěn)定;支持多種格式的索引罐监。
但是由于底層機(jī)制的限制吴藻,Solr的缺點(diǎn)也很明顯:
建立索引時(shí),搜索效率下降弓柱;實(shí)時(shí)索引搜索效率不高沟堡。
ES
ES也就是Elasticsearch,是一個(gè)實(shí)時(shí)的分布式搜索和分析引擎矢空,它可以用于全文搜索航罗,結(jié)構(gòu)化搜索以及分析。
由于Lucene過于復(fù)雜屁药,不方便使用伤哺。Elasticsearch使用Lucene作為內(nèi)部引擎,但是Elasticsearch做搜索引擎時(shí)者祖,只需要使用同一的API就可以立莉,而不需要了解復(fù)雜的Lucene原理。
而且Elasticsearch不僅僅可以做全文搜索功能七问,在企業(yè)中可以作為:
- 分布式實(shí)時(shí)文件存儲(chǔ)蜓耻;
- 實(shí)時(shí)分析的分布式搜索引擎;
Elasticsearch的Restful API友好而且簡(jiǎn)單械巡,特別容易上手刹淌。
目前包括維基百科、Stackoverflow讥耗、Github等都是用Elasticsearch作為其搜索引擎有勾。
ES簡(jiǎn)單體驗(yàn)
這里我們簡(jiǎn)單使用一個(gè)ES完成一個(gè)全文檢索功能。
1古程、下載
首先在官網(wǎng)下載 蔼卡,官網(wǎng)地址:https://www.elastic.co/products/elasticsearch
下載地址如下:https://www.elastic.co/cn/downloads/elasticsearch
選擇自己系統(tǒng)的我們這選擇WIndows版本。
同時(shí)我們可以下載kibana挣磨,kibana是配合ES的一個(gè)可視化工具雇逞。
2、安裝部署
解壓 放在d盤
隨后我們?cè)诿钚袉?dòng):
C:\Users\JN>d:
D:>cd
D:\elasticsearch-6.4.0>cd bin
D:\elasticsearch-6.4.0\bin>elasticsearch.bat
kibana也是
C:\Users\JN>d:
D:>cd kibana-6.4.0-windows-x86_64
D:\kibana-6.4.0-windows-x86_64>cd bin
D:\kibana-6.4.0-windows-x86_64\bin>kibana.bat
部署成功:可以通過localhost:9200訪問es
localhost:5601訪問kibana
3茁裙、簡(jiǎn)單使用
我們簡(jiǎn)單體驗(yàn)一下ES塘砸,打開kibana的DevTools工具。
分別插入兩條數(shù)據(jù)晤锥,并進(jìn)行搜索掉蔬。
使用編程語言調(diào)用ES也與這個(gè)類似廊宪,簡(jiǎn)單易用。