免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
【迅搜03】全文檢索、文檔、倒排索引與分詞

全文檢索、文檔、倒排索引與分詞

今天還是概念性的內(nèi)容,但是這些概念卻是整個(gè)搜索引擎中最重要的概念??梢哉f(shuō),所有的搜索引擎就是實(shí)現(xiàn)了類(lèi)似的概念才能稱之為搜索引擎。而且今天的內(nèi)容其實(shí)都是相關(guān)聯(lián)的,所以不要以為標(biāo)題上有四個(gè)名詞就感覺(jué)好像內(nèi)容很多一樣,其實(shí)它們都是聯(lián)系緊密的,一環(huán)套一環(huán)的。

全文檢索

先來(lái)看看啥叫 全文檢索 。

全文檢索是指計(jì)算機(jī)索引程序通過(guò)掃描文章中的每一個(gè)詞,對(duì)每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時(shí),檢索程序就根據(jù)事先建立的索引進(jìn)行查找,并將查找的結(jié)果反饋給用戶的檢索方式。這個(gè)過(guò)程類(lèi)似于通過(guò)字典中的檢索字表查字的過(guò)程。全文搜索搜索引擎數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

又是百科上的定義。但是,不管是 XS 還是 ES ,我們有時(shí)也都會(huì)叫它們?yōu)?全文檢索引擎 ?,F(xiàn)在知道了吧,搜索引擎組件,最核心的功能其實(shí)就在于全文檢索的能力。而在全文檢索的過(guò)程中,最核心的又是索引的建立,在上面概念中那句:通過(guò)字典中的檢索字表查字的過(guò)程。就是對(duì)于索引這個(gè)概念的一般性描述。

在學(xué)習(xí) ES 的過(guò)程中,會(huì)提到兩個(gè)概念,我覺(jué)得這兩個(gè)概念也是非常重要的。那就是 精確值 和 全文本 。

  • 精確值:那些不需要建立索引、不需要分詞的確定值,比如說(shuō) ID、時(shí)間、數(shù)字,也就是我們?cè)?MySQL 中不會(huì)用到 Like 的字段。
  • 全文本:需要分詞,需要對(duì)內(nèi)容建立索引的值,比如文章標(biāo)題、關(guān)鍵字、內(nèi)容、描述等,一般都是 Text 類(lèi)型,是我們搜索時(shí)主要面對(duì)的內(nèi)容,也是我們?cè)?MySQL 中需要進(jìn)行 Like 查詢的字段。

有了這兩個(gè)概念之后,以后我們?cè)诮⑺饕龝r(shí),就可以根據(jù)字段的不同情況,來(lái)決定字段是否應(yīng)該分詞建索引。如果不管任何字段都建立索引的話,會(huì)導(dǎo)致索引巨大,帶來(lái)額外的存儲(chǔ)及性能開(kāi)銷(xiāo)。

在全文檢索中,還有兩個(gè)概念,那就是 按字檢索 和 按詞檢索 。

對(duì)于英文來(lái)說(shuō),搜索分詞其實(shí)并不困難。因?yàn)橛⑽脑跁?shū)寫(xiě)時(shí)天生就有空格分隔。即使是一些簡(jiǎn)寫(xiě),比如 I'm ,也可以直接劃分為整個(gè)詞,或者做成 I am 的替換詞或近意詞。但中文就不一樣了。就像這一段話,你覺(jué)得要怎么切分呢?能切出來(lái)多少詞呢?用程序怎么實(shí)現(xiàn)?

這就是中文分詞的難點(diǎn)。如果說(shuō) 按字檢索 ,就會(huì)導(dǎo)致索引巨大。每一個(gè)字,每一個(gè)字和后面的句子的連接,都要建立索引。比如“我愛(ài)北京天安門(mén)”,如果按字分詞檢索,需要切分成:

  • 愛(ài)
  • 門(mén)

看著還好是吧?但是換成一整篇文章呢?再換成上百萬(wàn)篇文章呢?

那么按詞分詞檢索呢?我們就可以把上面那句話切分成:

  • 我愛(ài)
  • 北京
  • 天安門(mén)

先不說(shuō)查詢,至少存儲(chǔ)空間就能節(jié)約不少吧。后面我們馬上就會(huì)詳細(xì)地說(shuō)分詞這件事。

文檔

文檔在搜索引擎中,就是實(shí)際的存儲(chǔ)的數(shù)據(jù)單元。說(shuō)直白點(diǎn),就是我們?cè)?MySQL 的那一行數(shù)據(jù),將一行數(shù)據(jù)放到搜索引擎中,就是一篇文檔。只不過(guò)這個(gè)文檔是結(jié)構(gòu)化的,有結(jié)構(gòu)屬性的,有字段名和值,可以被查詢檢索出來(lái)的數(shù)據(jù)。在搜索引擎中,文檔是一個(gè)重要的概念,我們?cè)?、刪、改、查操作的都是文檔。而文檔在進(jìn)行上述操作時(shí),又會(huì)關(guān)聯(lián)到索引的建立。

在 XS 中,使用 PHP SDK 時(shí),專門(mén)的 XSDocument 是貫穿我們學(xué)習(xí)始終的一個(gè)對(duì)象。同樣地,在 ES 中,所有數(shù)據(jù)只有一個(gè) type 類(lèi)型,就是 _doc 類(lèi)型。這個(gè)不用多解釋了吧,doc 就是文檔的意思。

或者再換句話說(shuō),我們上面所說(shuō)的全文檢索引擎,以及我們這個(gè)系列要學(xué)習(xí)的搜索引擎,這兩個(gè)概念,最終都會(huì)落在 文檔搜索引擎 這個(gè)概念上。因?yàn)椴还茏侄螌傩匀绾?,我們其?shí)一直都是在搜索文檔。

倒排索引

到我們的重點(diǎn)概念咯,這也是常見(jiàn)的面試題。那就是啥是倒排索引?

要理解倒排索引(反向索引),我們就先要了解一下正排索引(正向索引)是啥。這個(gè)其實(shí)不用多說(shuō)了吧,普通關(guān)系型數(shù)據(jù)庫(kù)的索引都是正排索引嘛。我們?yōu)槟硞€(gè)字段建立索引,然后形成一顆 B+樹(shù) 。大概長(zhǎng)這樣。

典型的一個(gè) MySQL InnoDB B+樹(shù)索引圖,數(shù)據(jù)有三個(gè)字段,id、name、age ,然后 id 上有主鍵索引,name 和 age 做了聯(lián)合索引。在關(guān)系型數(shù)據(jù)庫(kù)中,索引上存儲(chǔ)的是字段具體的值,然后索引根據(jù)這些值排序。這樣在搜索查找時(shí)就可以利用類(lèi)似于二分查找的方式快速找到與查找值匹配的索引項(xiàng)目。如果是普通索引,則會(huì)找到最終的主鍵 ID ,進(jìn)而再使用主鍵 ID 通過(guò)主鍵索引(聚集索引)返表查詢出實(shí)際的數(shù)據(jù)。

這一套內(nèi)容大家在學(xué)習(xí)數(shù)據(jù)庫(kù)相關(guān)知識(shí)的時(shí)候應(yīng)該都會(huì)看到,這個(gè)不是我們的重點(diǎn)內(nèi)容,畢竟咱們現(xiàn)在是要講搜索引擎呀。那么搜索引擎里的倒排索引是啥意思呢?還是看圖來(lái)說(shuō)。

不得不說(shuō),倒排索引的圖還好畫(huà)一些。在這個(gè)圖中,我們假設(shè)全文本字段為 subject 和 message ,那么我們就需要對(duì)這兩個(gè)字段中的內(nèi)容進(jìn)行分詞,根據(jù)分詞結(jié)果形成一個(gè)倒排表。各位大佬一眼就明白了吧,每個(gè)詞項(xiàng)對(duì)應(yīng)記錄的就是這個(gè)詞所在的文檔的 ID 。當(dāng)然,實(shí)際上的倒排索引內(nèi)容可能不止這兩個(gè)字段,還會(huì)包括關(guān)鍵字在文檔中的位置等信息。這里就是簡(jiǎn)單地以最核心的單詞和文檔的關(guān)系來(lái)講解。

是的,這就是倒排索引。其實(shí)最終,它獲得的結(jié)果和 B+樹(shù) 的普通索引是類(lèi)似的,最終都是保存著一份主鍵 ID ,但 B+樹(shù) 索引的值是整個(gè)表行字段的值,最終記錄是在所有分枝之后的一個(gè)葉子節(jié)點(diǎn)上,而且只有一個(gè)值。而倒排索引保存的值是一個(gè)一個(gè)的詞項(xiàng),相同詞項(xiàng)只會(huì)有一份,最終記錄是一組 ID 。

要說(shuō)一個(gè)比較實(shí)際點(diǎn)的例子的話,請(qǐng)唱出《孤勇者》的三句歌詞和請(qǐng)說(shuō)出歌詞中包含包含“我愛(ài)你”的三首歌名,這種“根據(jù)題目查找內(nèi)容”和“根據(jù)關(guān)鍵字查找題目”的形式其實(shí)是完全相反的,分別代表的就是正排索引(整個(gè)字段建立索引,就像是個(gè)題目)和倒排索引(將內(nèi)容分成單詞變成一個(gè)字典,通過(guò)字典查找內(nèi)容和題目)。(極客時(shí)間:檢索核心技術(shù)20講,關(guān)于倒排索引的解釋)

如果數(shù)據(jù)非常多,而且也都是大篇文章,那么其實(shí)這個(gè)詞項(xiàng)列表的內(nèi)容也不少。這時(shí)候,大部分搜索引擎其實(shí)會(huì)在詞項(xiàng)上再次運(yùn)用 B+樹(shù) ,也就是通過(guò)二分法能夠快速定位詞項(xiàng)。這樣,就可以最快(最理想狀態(tài)下)通過(guò) O(logn) + O(1) 的速度定位到包含某一個(gè)詞的全部文檔 ID 。

如果我們同時(shí)搜索多個(gè)關(guān)鍵詞,則會(huì)在獲得所有關(guān)鍵詞對(duì)應(yīng)的文檔 ID 后,再進(jìn)行歸并或多路歸并排序的方法遍歷兩個(gè)單詞中所有的文檔 ID 所對(duì)應(yīng)的內(nèi)容,從而達(dá)到 O(m+n) 的速度,這里的 m 和 n 指的是單詞對(duì)應(yīng)文檔 ID 列表,而不是正排索引中的全文檔搜索的 n 。因此,它的效率還是可以接受的。(極客時(shí)間:檢索核心技術(shù)20講及百度查詢相關(guān)資料)具體的算法原理已經(jīng)不是我能達(dá)到的水平的,各位感興趣的大佬們還是自己再查找資料進(jìn)行深入的學(xué)習(xí)吧。

那么如果是傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的 Like 呢?首先,如果是大型的文章內(nèi)容,索引會(huì)非常大,空間極度浪費(fèi)。其次,如果是前后都模糊,也就是 like '%項(xiàng)目%' 這種,索引會(huì)失效。因?yàn)槲覀円枰饌€(gè)文字比較,然后再逐個(gè)文檔匹配,性能可想而知。

再換個(gè)角度用生活中的例子來(lái)理解,最典型的就是圖書(shū)目錄。我們最常見(jiàn)的那個(gè)圖書(shū)目錄,就是根據(jù)章節(jié)標(biāo)題的一個(gè)正排索引。而有的書(shū),特別是一些專業(yè)型的大型經(jīng)典圖書(shū),就是特別厚的那種。往往在這些書(shū)的最后還會(huì)有一些詞匯表,有的詞匯表不僅有詞匯的解釋,還有這些詞匯在哪些章節(jié)出現(xiàn)過(guò),甚至是具體的頁(yè)號(hào)。這種帶章節(jié)號(hào)或者頁(yè)號(hào)的詞匯表就是倒排索引。比如下面這本計(jì)算機(jī)經(jīng)典黑皮書(shū)《數(shù)據(jù)庫(kù)系統(tǒng)概念》中最后的索引部分的內(nèi)容。加微信或者公眾號(hào),可以找我要到很多電子書(shū)哦,其中就包括這本書(shū)。

好了,從倒排索引這里,我們可以看到 分詞 真的是對(duì)倒排索引非常重要的一個(gè)概念,那么我們就再來(lái)理解一下什么叫分詞。

分詞

顧名思義,分詞,就是將一句話,一個(gè)段落或者一整篇文章中的單詞分解出來(lái)。對(duì)應(yīng)到我們的數(shù)據(jù)中,其實(shí)就是將文檔中,需要全文本分析的字段內(nèi)容進(jìn)行分詞處理,然后將獲取到的分詞加入到倒排索引表。

前面我們就說(shuō)過(guò),英文分詞會(huì)相對(duì)來(lái)說(shuō)簡(jiǎn)單一些,中文分詞要復(fù)雜一些。因此,我們平常不管是使用 ES ,還是 Solr、Sphinx 之類(lèi)的搜索引擎,都需要同時(shí)配置一個(gè)中文分詞器。現(xiàn)在最流行的,一個(gè)是 Jieba ,Python 領(lǐng)域非常出名也是現(xiàn)在整個(gè)開(kāi)發(fā)領(lǐng)域都比較流行的分詞器。另一個(gè)是 IK ,這個(gè)是最經(jīng)典的配合 ES 的分詞器,當(dāng)然,Jieba 也有 ES 的插件。

雖說(shuō)這兩個(gè)現(xiàn)在很流行,很出名,但咱們的 XS 所使用的 SCWS ,則是還沒(méi)有它們的時(shí)候就已經(jīng)存在的,通過(guò) C/C++ 開(kāi)發(fā)的一款優(yōu)秀分詞器。最早,甚至 ES 還沒(méi)發(fā)布的時(shí)候,大概 2011 年左右(ES最早是2010年發(fā)布的)。我所在的公司使用 Solr 作為搜索引擎,而當(dāng)時(shí)配合 Solr 的分詞器就是 SCWS 。

還有更早的,我剛畢業(yè)時(shí)做過(guò)一年 C# ,也就是 ASP.NET 開(kāi)發(fā),大概是  2009 年。當(dāng)時(shí)的公司使用的是 Lucene.NET 配合 Pangu 分詞。

可以看到,不管你是用什么搜索引擎,要在中文世界里使用,分詞器都是必不可少的。同時(shí),分詞器也不是你理解的就是切分個(gè)單詞就完了,它還要考慮詞性,比如動(dòng)、名、形容詞。這些詞性又會(huì)影響到詞頻和逆文檔詞頻分?jǐn)?shù)以及是否索引。再比如助詞、語(yǔ)氣詞:嗯、啊、哈,這些,大部分分詞工具直接就會(huì)給過(guò)濾掉,因?yàn)樗鼈儗?duì)于語(yǔ)義搜索沒(méi)啥用。

怎么又來(lái)一堆名詞了?還能不能愉快的玩耍了?

別急別急,這些內(nèi)容我們后面就可以貫穿在與之相關(guān)的內(nèi)容中一起學(xué)習(xí)了。現(xiàn)在先有個(gè)大概的了解就好了。

所幸,上面的那些分詞器,Jieba、IK,以及我們主要要學(xué)習(xí)的 SCWS ,在形式、功能上都非常相似。就和搜索引擎一樣,不管是 ES 還是 XS ,最終都是要實(shí)現(xiàn)全文檢索的,也要做倒排索引的。因此,學(xué)完 XS 的分詞以及 SCWS 的分詞相關(guān)內(nèi)容后,再看 Jieba 或者 IK 都能很快上手的。

另外,在擴(kuò)展部分,我們會(huì)簡(jiǎn)單地學(xué)習(xí)使用 TNTSearch + PHP JIEBA ,到時(shí)就會(huì)告訴大家,語(yǔ)言實(shí)現(xiàn)都是其次的,核心的概念原理才是最重要的,PHP 一樣可以實(shí)現(xiàn)完整的、純 PHP 的 搜索引擎+分詞 系統(tǒng),從而實(shí)現(xiàn)純 PHP 的搜索引擎解決方案。

學(xué)到這里,不得不提一句。碼農(nóng)們都喜歡抬G貶B。這里的 G 和 B 就不用多做解釋了吧,其實(shí) Baidu 的中文搜索很強(qiáng)的,李彥宏大佬“超鏈分析”相關(guān)的論文也對(duì) G 站 PR(PageRank)有重要的影響。中文分詞與語(yǔ)義處理,從技術(shù)角度和搜索結(jié)果來(lái)說(shuō),Baidu 確實(shí)是比 G 站強(qiáng)的。只不過(guò)滿屏廣告影響用戶體驗(yàn),而且碼農(nóng)們喜歡直接復(fù)制英文報(bào)錯(cuò)信息去 G 站搜索,獲得的內(nèi)容更全面(你懂得),從而讓大家覺(jué)得 G 站更好。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Elasticsearch全文檢索實(shí)戰(zhàn)小結(jié)——復(fù)盤(pán)我?guī)У牡诙€(gè)項(xiàng)目
基于Sphinx+MySQL的千萬(wàn)級(jí)數(shù)據(jù)全文檢索架構(gòu)設(shè)計(jì)
ElasticSearch的學(xué)習(xí)筆記并整合SpringBoot做測(cè)試
ES入門(mén)及安裝軟件
什么是Lucene和Solr和Elasticsearch,它們的區(qū)別是什么?
搜索引擎原理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服