1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        elasticsearch倒排索引與TF-IDF算法

        共 2758字,需瀏覽 6分鐘

         ·

        2021-03-26 20:43


        點(diǎn)擊上方藍(lán)色“邁莫coding”,選擇“設(shè)為星標(biāo)”



        一、倒排索引(Inverted Index)簡(jiǎn)介

         

        在關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)里,索引是檢索數(shù)據(jù)最有效率的方式。但對(duì)于搜索引擎,它并不能滿(mǎn)足其特殊要求,比如海量數(shù)據(jù)下比如百度或者谷歌要搜索百億級(jí)的網(wǎng)頁(yè),如果使用類(lèi)似關(guān)系型數(shù)據(jù)庫(kù)使用的B+樹(shù)索引,可想而知其對(duì)cpu的計(jì)算能力要求得有多高。其次關(guān)系型數(shù)據(jù)庫(kù)中一般存儲(chǔ)的都是結(jié)構(gòu)化的數(shù)據(jù),數(shù)據(jù)格式都是一定的,操作上一般也都是curd等比較簡(jiǎn)單的操作。

         

        倒排索引區(qū)別于正向索引,一般的倒排索引被用來(lái)做全文搜索。比如現(xiàn)在有一本10w字的書(shū),單詞使用量為3k,我要從中搜索某個(gè)詞出現(xiàn)的章節(jié),我們?cè)撛趺醋觯?/span>

         

        • 正排索引:遍歷這本書(shū),記錄該次出現(xiàn)的章節(jié)。我們幾乎要遍歷完10w個(gè)詞才能統(tǒng)計(jì)完。

         

        • 倒排索引:建立倒排索引,將每個(gè)詞作為key,該詞出現(xiàn)的章節(jié)為value。我們只要在3k個(gè)單詞中找到我們的目標(biāo)詞即可。

         

        這樣的話(huà),顯然倒排索引對(duì)于全文搜索性能更好。(上面舉得例子不太好,湊合吧)

        一般的正排索引是以key找value,而倒排索引則是以value找key。反轉(zhuǎn)了key-value的關(guān)系。

         


        二、es中的倒排索引

         

        在es中text類(lèi)型字段默認(rèn)只會(huì)建立倒排索引,其它幾種類(lèi)型在建立倒排索引的時(shí)候還會(huì)建立正排索引,當(dāng)然es是支持自定義的。在這里這個(gè)正排索引其實(shí)就是Doc Value。本章節(jié)我們主要是介紹倒排索引。下面我們介紹一個(gè)例子,看看倒排索引是如何建立的。

         

        比如我們有兩個(gè)doc(document 文檔),都有一個(gè)content字段

         

        doc_1:The quick brown fox jumped over the lazy dog
        doc_2:Quick brown foxes jump over lazy dogs in summer

         

        首先在es底層分詞器會(huì)對(duì)doc進(jìn)行分詞,得到一個(gè)個(gè)term(單詞),然后建立一個(gè)映射關(guān)系,記錄存在各個(gè)單詞的文檔。首先我們分析一下各個(gè)單詞存在的文檔。

         

         

         因?yàn)槊總€(gè)doc都是由id唯一標(biāo)識(shí)的,所以其會(huì)建立一個(gè)映射關(guān)系。

         

         

        當(dāng)es建立了這種映射關(guān)系,當(dāng)我們搜索一個(gè)單詞的時(shí)候,是不是就不需要遍歷每個(gè)文檔了呢。當(dāng)然,es的倒排索引并不會(huì)這么簡(jiǎn)單。

         

        term優(yōu)化,比如我們用百度搜索“JUmped”這個(gè)詞

         

         

        很容易發(fā)現(xiàn),竟然區(qū)分好了大小寫(xiě),并且還只能的匹配到了不同的時(shí)態(tài)。所以es同樣也是這樣的,es的分詞器會(huì)對(duì)單詞進(jìn)行一定的處理,比如:

         

        1 大小寫(xiě)轉(zhuǎn)換:Quick --> quick2 近義詞轉(zhuǎn)換:mother --> mom3 時(shí)態(tài)轉(zhuǎn)換:jumped --> jump4 單復(fù)數(shù)轉(zhuǎn)換:dogs --> dog......注意:不同的分詞器的分詞方式和算法都是不盡相同的。要注意這一點(diǎn)。

         

        當(dāng)es進(jìn)行了term優(yōu)化之后,我們?cè)倏纯催@個(gè)倒排索引:

         

         

         

         當(dāng)?shù)古潘饕缟纤?,我們很容易就能進(jìn)行全文搜索。

         


        三、TF-IDF算法

         

        TF-IDF(term frequency–inverse document frequency)是一種用于資訊檢索與資訊探勘的常用加權(quán)技術(shù)。TF-IDF是一種統(tǒng)計(jì)方法,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降。TF-IDF加權(quán)的各種形式常被搜尋引擎應(yīng)用,作為文件與用戶(hù)查詢(xún)之間相關(guān)程度的度量或評(píng)級(jí)。除了TF-IDF以外,因特網(wǎng)上的搜尋引擎還會(huì)使用基于連結(jié)分析的評(píng)級(jí)方法,以確定文件在搜尋結(jié)果中出現(xiàn)的順序。

         

        Term frequency:搜索文本中的各個(gè)詞條在field文本中出現(xiàn)了多少次,出現(xiàn)次數(shù)越多,就越相關(guān)

         

        在es中進(jìn)行全文搜索時(shí),搜索結(jié)果的匹配度也是采用的TF-IDF算法。這個(gè)匹配度是能夠在es的元數(shù)據(jù) _score 屬性中體現(xiàn)出來(lái)的。通過(guò)實(shí)驗(yàn)驗(yàn)證一下。

         

        1. 首先建立一個(gè)索引

         

        PUT /my_index?pretty

         

        1. 插入數(shù)據(jù)

         

        PUT /my_index/my_index_type/1{  "content":"The quick brown fox jumped over the lazy dog"}PUT /my_index/my_index_type/2{  "content":"Quick brown foxes jump over lazy dogs in summer"}

         

        1. 搜索


         GET /my_index/my_index_type/_search {   "query":{     "match":{       "content": "quick"     }   } }

         

        1. 搜索結(jié)果

         

         

         

        通過(guò)以上結(jié)果我們很容易發(fā)現(xiàn),es通過(guò)TF-IDF算法計(jì)算出來(lái)了相關(guān)度 _score。并且還勿略了大小寫(xiě)。

         

        如果我們搜索單詞“summer”,結(jié)果如下所示,只匹配到了doc1。

         

         

         


        分割線(xiàn)



        原文地址:https://www.cnblogs.com/hello-shf/p/11543460.html



        往期推薦


        elasticsearch入門(mén)篇

        go語(yǔ)言十分鐘入門(mén)教程

        你真的知道怎么實(shí)現(xiàn)一個(gè)延遲隊(duì)列嗎?

        SQL語(yǔ)句中where條件為什么寫(xiě)上1=1

        mysql那些事兒|深入淺出mysql索引(上)

        七天從零實(shí)現(xiàn)ORM框架


        文章也會(huì)持續(xù)更新,可以微信搜索「 邁莫coding 」第一時(shí)間閱讀。每天分享優(yōu)質(zhì)文章、大廠(chǎng)經(jīng)驗(yàn)、大廠(chǎng)面經(jīng),助力面試,是每個(gè)程序員值得關(guān)注的平臺(tái)。



        1. 你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡


        瀏覽 55
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            影音先锋成人电影在线观看 | 91久久久无码国产一区二区三区 | 久久久久久毛片精品免费不卡 | 免费观看黄网 | 99精品久久久久久久免费看蜜月 | www.狠狠鲁 | 68精品国产免费久久久久久婷婷 | 黄片视频在线看 | 亚洲三级在线看 | 天堂国产在线视频 |