《搜索引擎科普》

一、前言

在日常生活中我們常常用到搜索功能,不管是專業(yè)的搜索引擎百度,谷歌還是各類APP內(nèi)嵌的搜索功能。搜索本質(zhì)上是用戶和搜索引擎之間的一種人機(jī)對(duì)話,用戶通過為搜索引擎提供合適查詢條件,以滿足其信息需求,搜索引擎利用這些查詢條件和定制化規(guī)則,給用戶返回期望的相關(guān)性內(nèi)容。作為一個(gè)初階的搜索PM,本文意在以相對(duì)通俗的語(yǔ)言講解搜索的工作原理,歡迎拍磚。

全文較長(zhǎng),以下為整體流程圖:

二、搜索引擎概述

2.1什么是全文搜索引擎

百度百科的定義為:全文搜索引擎是目前廣泛應(yīng)用的主流搜索引擎。它的工作原理是計(jì)算機(jī)索引程序通過掃描文章中的每一個(gè)詞,對(duì)每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時(shí),檢索程序就根據(jù)事先建立的索引進(jìn)行查找,并將查找的結(jié)果反饋給用戶的檢索方式。這個(gè)過程類似于通過字典中的檢索字表查字的過程。

對(duì)于像我們這樣的初學(xué)者,往往對(duì)搜索引擎的實(shí)現(xiàn)方式抱有極大的誤解,一方面覺得搜索就是一個(gè)黑盒,搜索效果極難把控,另一方面又覺得搜索技術(shù)相對(duì)復(fù)雜,對(duì)于其原理難以理解。其實(shí)搜索在本質(zhì)上依然是機(jī)械的詞匹配(term-matching),大量復(fù)雜的其他環(huán)節(jié)均是為了保證該環(huán)節(jié)的準(zhǔn)確高效,后面將會(huì)詳細(xì)講述搜索引擎工作的整個(gè)過程

2.2什么情況下需要搜索引擎

對(duì)于少量結(jié)構(gòu)化數(shù)據(jù)而言,數(shù)據(jù)庫(kù)(如 Oracle、SQL Server )已經(jīng)可以實(shí)現(xiàn)查詢檢索或者聚類分析功能,但對(duì)于非結(jié)構(gòu)化數(shù)據(jù),或者數(shù)據(jù)量級(jí)較大的情況時(shí),就需要搜索引擎的幫助了,以下是從網(wǎng)上摘錄的需要搜索引擎的幾種觸發(fā)條件,這里不做討論。

1、搜索的數(shù)據(jù)對(duì)象是大量的非結(jié)構(gòu)化的文本數(shù)據(jù)。

2、文件記錄量達(dá)到數(shù)十萬(wàn)或數(shù)百萬(wàn)個(gè)甚至更多。

3、支持大量基于交互式文本的查詢。

4、需求非常靈活的全文搜索查詢。

5、對(duì)高度相關(guān)的搜索結(jié)果的有特殊需求,但是沒有可用的關(guān)系數(shù)據(jù)庫(kù)可以滿足。

6、對(duì)不同記錄類型、非文本數(shù)據(jù)操作或安全事務(wù)處理的需求相對(duì)較少的情況。

2.3常見的搜索引擎介紹

現(xiàn)在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch這三種

Lucene是一個(gè)Java全文搜索引擎,完全用Java編寫。需要注意的是Lucene不是一個(gè)完整的應(yīng)用程序,而是一個(gè)代碼庫(kù)和API,可以很容易地用于向應(yīng)用程序添加搜索功能

Apache Solr是一個(gè)基于名為L(zhǎng)ucene的Java庫(kù)構(gòu)建的開源搜索平臺(tái)。它以用戶友好的方式提供Apache Lucene的搜索功能。作為一個(gè)行業(yè)參與者近十年,它是一個(gè)成熟的產(chǎn)品,擁有強(qiáng)大而廣泛的用戶社區(qū)。它提供分布式索引,復(fù)制,負(fù)載平衡查詢以及自動(dòng)故障轉(zhuǎn)移和恢復(fù)。

Elasticsearch是在Solr之后幾年推出的。它提供了一個(gè)分布式,多租戶能力的全文搜索引擎,支持多種語(yǔ)言,更加友好,可以理解為在Lucene基礎(chǔ)上進(jìn)行了二次封裝。

2.4常見的搜索引擎對(duì)比

雖然solr和ES 本質(zhì)上都是基于Lucene的,但由于Lucene的復(fù)雜性,除了一些公司需要自研搜索框架,底層需要依賴Lucene外,一般很少會(huì)考慮它作為搜索的第一選擇,

對(duì)于solr和ES ,在綜合考慮實(shí)現(xiàn)成本和易用性后,個(gè)人覺得 ElasticSearch較為出色。(當(dāng)然如果公司現(xiàn)在已經(jīng)是solr了? 并沒有遷移的必要)

2.5搜索專有名詞講解

為了更好地理解搜索引擎工作的原理,我們先講解幾個(gè)搜索相關(guān)的名詞

1、Index:索引,由很多的 Document 組成,是搜索引擎的核心,可以粗暴的理解為一種特定的存儲(chǔ)數(shù)據(jù)方式

2、Document:文檔,是搜索的核心,搜索、存儲(chǔ)、返回的都是文檔,它由很多的 Field 組成,是索引和搜索的最小單位。

3、Field:字段,由很多的 Term 組成,包括 Field Name和 Field Value。

4、Segment:段,可以理解為一個(gè)子索引,添加索引時(shí)并不是每個(gè) document 都馬上添加到同一個(gè)索引文件,它們首先被寫入到不同的小文件,然后再合并成一個(gè)大索引文件,這里每個(gè)小文件都是一個(gè) segment。

5、Term:由很多的字節(jié)組成。分詞之后的每個(gè)最小單元叫做 Term。

6、Token:Token 是 term 的一次出現(xiàn),它包含 term? 文本和相應(yīng)的起止偏移,以及一個(gè)類型字符串。一句話中可以出現(xiàn)多次相同的詞語(yǔ),它們都用同一個(gè) term 表示,但是用不同的 Token,每個(gè) Token 標(biāo)記該詞語(yǔ)出現(xiàn)的地方。

三、搜索引擎的工作流程

想要搜索引擎正常工作可以粗暴的分為兩個(gè)環(huán)節(jié),第一個(gè)為內(nèi)容的處理過程,相當(dāng)于準(zhǔn)備工作。第二環(huán)節(jié)個(gè)為 接收到用戶的query請(qǐng)求后的處理過程。

3.1對(duì)內(nèi)容進(jìn)行索引處理

將數(shù)據(jù)存儲(chǔ)進(jìn)數(shù)據(jù)存儲(chǔ)的過程中需要信息的提?。╡xtract)、轉(zhuǎn)換(transform)和加載(load)過程,通常縮寫成ETL,搜索引擎把目標(biāo)數(shù)據(jù)按照特定的格式存儲(chǔ)的過程依然符合這個(gè)流程。如下圖所示,這些環(huán)節(jié)包含提取、充實(shí)、分析索引。下面分環(huán)節(jié)講解

3.11提取-將內(nèi)容提取為文檔

文檔,是搜索的核心,搜索、存儲(chǔ)、返回的其實(shí)都是文檔,搜索的數(shù)據(jù)來(lái)源有很多,理想的情況我們所需要的數(shù)據(jù)被規(guī)整的存儲(chǔ)在我們的數(shù)據(jù)庫(kù)中,這種情況比較簡(jiǎn)單,按照流程提取即可。復(fù)雜一點(diǎn)的情況我們的數(shù)據(jù)來(lái)源于互聯(lián)網(wǎng)或者其他地方,我們就需要進(jìn)行額外的處理(清洗,識(shí)別)。該環(huán)節(jié)的最終目的是將搜索數(shù)據(jù)處理后以文檔的形式發(fā)送給搜索引擎

3.12充實(shí)-清理、強(qiáng)化、合并文檔

文檔充實(shí)包括三大部分:清洗數(shù)據(jù)、強(qiáng)化數(shù)據(jù)、以及合并外部數(shù)據(jù)。

清洗:清洗數(shù)據(jù)這一條最好理解,為了獲得一流的搜索體驗(yàn),我們事先需要對(duì)已經(jīng)轉(zhuǎn)換成文檔的數(shù)據(jù)進(jìn)行一些諸如拼寫錯(cuò)誤之類的處理。

強(qiáng)化:這一環(huán)節(jié)意在對(duì)文檔進(jìn)行一些比清洗更高級(jí)的處理,提取出一些有用的特征,例如利用機(jī)器學(xué)習(xí)對(duì)文檔進(jìn)行分類或聚類,或者利用情感分析&語(yǔ)義識(shí)別來(lái)確定一篇文章的主旨和其他特征,這一環(huán)節(jié)在后續(xù)的排序等環(huán)節(jié)都有巨大的裨益,具有較大的操作空間

合并:這里指的合并并不是指文檔之間的合并,而是指將一些新的標(biāo)準(zhǔn)化的數(shù)據(jù)合并到文檔中,比如來(lái)自不同數(shù)據(jù)庫(kù)之間的數(shù)據(jù)字段的缺失補(bǔ)全(eg:產(chǎn)地、國(guó)家)

3.13分析-字符過濾、分詞處理、token過濾

當(dāng)搜索數(shù)據(jù)從各地轉(zhuǎn)換成標(biāo)準(zhǔn)的“文檔”后,將會(huì)進(jìn)行分析環(huán)節(jié),在這個(gè)環(huán)節(jié)搜索引擎將會(huì)把文檔數(shù)據(jù)轉(zhuǎn)換成token,存儲(chǔ)于搜索內(nèi)部供下一步索引所用。這個(gè)環(huán)節(jié)同樣分為三步:字符過濾、分詞處理、token過濾

字符過濾:利用字符過濾器,過濾掉多余的格式和字符,這個(gè)環(huán)節(jié)可根據(jù)實(shí)際需要做任何處理,如果有需要還可以用正則表達(dá)式或者建立自己的字符過濾器

分詞處理:顧名思義,分詞就是將原生文本分詞成一個(gè)個(gè)獨(dú)立的token,最簡(jiǎn)單的分詞方法就是利用空格和標(biāo)點(diǎn)符號(hào)進(jìn)行標(biāo)準(zhǔn)分詞,當(dāng)然這種時(shí)候大部分效果都不太好,可以嘗試著用國(guó)內(nèi)比較流行的中文分詞工具,如jieba、SnowNLP、THULAC、NLPIR。分詞是影響搜索結(jié)果的一個(gè)重要環(huán)節(jié),為了保證分詞的準(zhǔn)確性我們需要進(jìn)行許多工作(核心詞、知識(shí)圖譜、語(yǔ)義識(shí)別等等),這里不做展開。

token 過濾:該部與字符過濾器的功能類似,通過對(duì)token的添加刪除&修改,對(duì)token流進(jìn)行調(diào)整,本質(zhì)上都是對(duì)元數(shù)據(jù)的標(biāo)準(zhǔn)化處理

3.14索引-倒排索引

劃重點(diǎn),倒排索引(inverted index)是搜索的精髓,重中之重!需要重點(diǎn)理解

倒排索引由兩部分組成:詞典和倒排表。詞典是制定字段在一個(gè)文檔集合中出現(xiàn)的所有詞匯所組成的有序列表。詞典中的每一個(gè)詞都有一個(gè)包含該詞的文檔ID與之對(duì)應(yīng)。為了更好地理解,我們舉個(gè)例子:

文檔:

0:one shoe,two shoe,the red shoe,the blue shoe.

1:? the blue dress shoe is the best shoe

2:? the best dress is the one red dress

詞典:

best:0 blue:1? dress:2 is:3 one:4 red:5? shoe:6 the:7 two:8

倒排表:

0:[1,2]? ? 1:[0,1]

2:[1,2]

3:[1,2]

4:[0,2]

5:[0,2]

6:[0,1]

7:[0,1,2]

8:[0]

此時(shí)假設(shè)用戶搜索red,通過詞典我們知道red對(duì)應(yīng)的序號(hào)為5,然后通過倒排表即可發(fā)現(xiàn)相關(guān)文檔為0和2。以上就是倒排索引的實(shí)現(xiàn)方式和原理,在實(shí)際操作中,為了更好地用戶體驗(yàn),我們還可以利用更多的索引屬性數(shù)據(jù),如:文檔頻率、詞頻、詞位置、詞偏移量等等,這里不做詳述

3.2召回結(jié)果并排序

3.21布爾搜索

在做完搜索的前期準(zhǔn)備后,我們已經(jīng)能實(shí)現(xiàn)單個(gè)詞的文檔搜索了,但是對(duì)于多個(gè)詞的匹配,我們還需要更好地方法,即布爾搜索,布爾搜索可以合并多條查詢的返回結(jié)果,從而提供更好地搜索體驗(yàn)。

典型的布爾操作理解和實(shí)現(xiàn)均較為簡(jiǎn)單:即(AND\OR\NOT),包含,有其一,完全不包含。

以lucene為例,有一種查詢類型為booleanquery的函數(shù)用于實(shí)現(xiàn)布爾搜索,他有三個(gè)字段:SHOULD\MUST\MUST_NOT,及必須包含,選擇性包含和一定不包含。通過這些子句的排列組合就可以實(shí)現(xiàn)簡(jiǎn)單的搜索啦~~~

3.32 query處理

該環(huán)節(jié)的意義為在用戶的幫助下更好的搜索,比較簡(jiǎn)單的實(shí)例是篩選器,query糾錯(cuò)、同義詞、近義詞等,意在更好的理解用戶的意圖,幫助用戶寫出一個(gè)更精準(zhǔn)更符合搜索邏輯的query詞,以提升搜索準(zhǔn)確性。這里也是搜索產(chǎn)品經(jīng)理工作的重點(diǎn)方向,本次不作講解了

3.33排序排名

在處理好數(shù)據(jù)、能實(shí)現(xiàn)簡(jiǎn)單搜索以及幫助用戶處理好query后,我們就需要對(duì)得到的文檔進(jìn)行排名啦~在實(shí)際應(yīng)用中,除了最關(guān)鍵的相關(guān)性部分,往往我們還需要考慮地域、商業(yè)化甚至個(gè)性化等因素綜合的決定每一篇文檔的排序位置,這里只考慮相關(guān)性的問題。

文檔的相關(guān)性是由“排名函數(shù)”決定的,排名函數(shù)接受query和匹配文檔的所有信息,并針對(duì)每一篇文檔給出一個(gè)相關(guān)性得分,代表著這篇文的匹配的程度。

排名函數(shù)的基本原理是考察詞頻(TF)和詞的重要程度(IDF),即TF-IDF,通俗的理解為搜索詞在對(duì)應(yīng)的文檔中出現(xiàn)的次數(shù)越多,得分越高,此為詞頻,詞越短出現(xiàn)次數(shù)越少,則越重要此為逆文本頻率指數(shù)。這兩項(xiàng)想乘就會(huì)得到每個(gè)query詞對(duì)應(yīng)文檔的相關(guān)性得分,在此基礎(chǔ)上可以再結(jié)合業(yè)務(wù)邏輯乘以相關(guān)系數(shù)(boost),來(lái)調(diào)優(yōu)。

四、總結(jié)

以上就是搜索的整個(gè)工作流程和原理了。搜索是提高APP信息獲取效率的重要方式,以上只是粗淺的理解整個(gè)過程,實(shí)際上每個(gè)環(huán)節(jié)都有很多很復(fù)雜的工作要做,作為一個(gè)初級(jí)搜索產(chǎn)品經(jīng)理,要學(xué)習(xí)的東西還有很多~~共勉~

資料引用:

《相關(guān)性搜索》-Doug Turnbull John Berryman

《這就是搜索引擎:核心技術(shù)詳解》

https://www.cnblogs.com/jajian/p/9801154.html

https://www.cnblogs.com/dreamroute/p/8484457.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容