一文讓你輕松了解全文檢索

全文檢索技術(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)單易用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末女轿,一起剝皮案震驚了整個(gè)濱河市箭启,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谈喳,老刑警劉巖册烈,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婿禽,居然都是意外死亡赏僧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門扭倾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淀零,“玉大人,你說我怎么就攤上這事膛壹〖葜校” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵模聋,是天一觀的道長(zhǎng)肩民。 經(jīng)常有香客問我,道長(zhǎng)链方,這世上最難降的妖魔是什么持痰? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祟蚀,結(jié)果婚禮上工窍,老公的妹妹穿的比我還像新娘。我一直安慰自己前酿,他們只是感情好患雏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罢维,像睡著了一般淹仑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上言津,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天攻人,我揣著相機(jī)與錄音,去河邊找鬼悬槽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞬浓,可吹牛的內(nèi)容都是我干的初婆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼磅叛!你這毒婦竟也來了屑咳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤弊琴,失蹤者是張志新(化名)和其女友劉穎兆龙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敲董,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡紫皇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腋寨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聪铺。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萄窜,靈堂內(nèi)的尸體忽然破棺而出铃剔,到底是詐尸還是另有隱情,我是刑警寧澤查刻,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布键兜,位于F島的核電站,受9級(jí)特大地震影響穗泵,放射性物質(zhì)發(fā)生泄漏普气。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一火欧、第九天 我趴在偏房一處隱蔽的房頂上張望棋电。 院中可真熱鬧,春花似錦苇侵、人聲如沸赶盔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽于未。三九已至,卻和暖如春陡鹃,著一層夾襖步出監(jiān)牢的瞬間烘浦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工萍鲸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闷叉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓脊阴,卻偏偏與公主長(zhǎng)得像握侧,于是被迫代替她去往敵國(guó)和親蚯瞧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 最近項(xiàng)目組安排了一個(gè)任務(wù)品擎,項(xiàng)目中用到了基于 Solr 的全文搜索埋合,但是該 Solr 搜索云項(xiàng)目不穩(wěn)定,經(jīng)常查...
    printf200閱讀 1,569評(píng)論 0 6
  • 前言 最近項(xiàng)目組安排了一個(gè)任務(wù)萄传,項(xiàng)目中用到了基于 Solr 的全文搜索甚颂,但是該 Solr 搜索云項(xiàng)目不穩(wěn)定,經(jīng)常查...
    zwb_jianshu閱讀 2,627評(píng)論 0 2
  • 1. 案例分析:什么時(shí)全文檢索秀菱,如何實(shí)現(xiàn)全文檢索 ? 1.1 案例 ? 實(shí)現(xiàn)一個(gè)文件的搜索功能振诬,通過關(guān)鍵字搜索文件...
    東方舵手閱讀 1,181評(píng)論 0 1
  • Solr&ElasticSearch原理及應(yīng)用 一、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,291評(píng)論 1 17
  • 這并不是一個(gè)特別的日子答朋,它和好多個(gè)早晨一樣贷揽,北方的冬天總是有一些霧霾,輕的或者重一些的梦碗,我有過好多這樣平靜的早晨...
    春風(fēng)化雨_5d34閱讀 82評(píng)論 0 0