日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搜索的一般过程

發(fā)布時間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搜索的一般过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??之前學(xué)習(xí)過很多劉老師的lucene源碼分析的課程,結(jié)果現(xiàn)在整的都忘了,這次重新梳理一下爭取形成自己的東西。
后面就不容易忘掉了。
??劉老師的課程是基于lucene2.x的源碼分析的,后面lucene迭代了很多版本,也引入了新的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,但是主體的模塊基本上是沒有變的。計劃是先把之前的lunce的數(shù)據(jù)結(jié)構(gòu)整理一下,因為可以查閱劉老師的課程,可以有很好的參考作用。在這個基礎(chǔ)上再整理和對比新的lucene的優(yōu)化點(diǎn),基于lucene7.x在這里主要關(guān)注lucene的存儲結(jié)構(gòu),因為了解了存儲結(jié)構(gòu)基本上就了解了大體的實(shí)現(xiàn)。

1. 搜索的概覽

搜索主要是解決用戶基于文本進(jìn)行搜索的問題。比如在很多本書中搜索一些內(nèi)容,或者搜索一些帖子,博客等等。
一個搜索服務(wù)架構(gòu)分為兩大部分:索引+搜索。

1.1 索引

索引的過程又分為數(shù)據(jù)采集,清洗,進(jìn)入lucene等等,這里我們不關(guān)注數(shù)據(jù)源的問題,只關(guān)注索引在進(jìn)入lucene會有哪些操作。

1.1.1. 數(shù)據(jù)處理

在往lucene進(jìn)行數(shù)據(jù)存儲的時候首先會進(jìn)行分詞,比如"我的家鄉(xiāng)是河南","this ARE GOOD books " 在下面顯示了對應(yīng)的分詞結(jié)果

GET user/_analyze {"analyzer": "ik_smart","text": ["我的家鄉(xiāng)是河南"] }對應(yīng)的分詞結(jié)果是 {"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "的","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "家鄉(xiāng)","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "是","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3},{"token" : "河南","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 4}] }

再來一個英文的

GET user/_analyze {"analyzer": "ik_smart","text": ["this ARE GOOD books "] }{"tokens" : [{"token" : "good","start_offset" : 9,"end_offset" : 13,"type" : "ENGLISH","position" : 0},{"token" : "books","start_offset" : 14,"end_offset" : 19,"type" : "ENGLISH","position" : 1}] }

對應(yīng)的可以看到,一個句子被分成了多個詞,同時可能會有一些轉(zhuǎn)化,比如大寫變小寫,復(fù)數(shù)變單數(shù)等。
其實(shí)analyzer又有三個部分組成

  • character_filter 對輸入文檔的源數(shù)據(jù)進(jìn)行處理,比如將拉丁文轉(zhuǎn)為數(shù)字等,也可以是刪掉一些字符
  • tokenizer 對character_filter 過濾后的文檔進(jìn)行分詞,會記錄詞的位置信息以及字符偏移量
  • token_filter 對分出來的詞進(jìn)行處理,比如大寫轉(zhuǎn)小寫,詞干抽取等。
  • 詞干抽取被稱為stemming,方式也分為兩種,基于算法的詞干抽取和基于字典的詞干抽取。
    基于算法有可能會導(dǎo)致不準(zhǔn)確的結(jié)果,但是只要index 和 query的過程都使用同樣的算法,那么就可以保證搜索效果的一致性。
    基于字典的詞干抽取的效果則取決于字典的質(zhì)量,而且大量的字典可能會占據(jù)比較大的內(nèi)存。

    1.1.2. 數(shù)據(jù)存儲

    在一個文檔進(jìn)行了分詞,詞干提取等處理之后,會交給indexer,由indexer來進(jìn)行存儲。
    存儲一般包括兩個部分,索引的正向信息,和反向信息,
    正向信息是指從index–>segment—>doc-field—>field-terms 的信息,這里存儲的基本上是文檔的正向信息,也是完整信息。
    反向信息就是我們常說的倒排索引了 terms—>doc-list 通過對terms的命中可以快速的找到對應(yīng)的doc信息。

    1.2 查詢search

    query樣例 用戶輸入語句:lucene AND learned NOT hadoop。

    1.2.1. 語法分析

    查詢語句又會有一些語法,類似sql一樣,必有有or,and,not等語法,所以先要進(jìn)行這些語法分析,識別這些關(guān)鍵字
    提取了兩個關(guān)鍵字 AND NOT

    1.2.2. 詞分析

    和index的時候?qū)Υ说牟僮魇且恢碌?br /> 上面會產(chǎn)生三個term lucene learned hadoop

    1.2.3 搜索搜因得到文檔

  • 根據(jù)前面兩步得到了查詢的邏輯以及對應(yīng)的term
  • 從倒排鏈表中找到對應(yīng)的文檔集合,得到3個文檔集合
  • 對lucene和learned對應(yīng)的兩個文檔集合求交集,然后和hadoop的文檔集合求差集。
  • 1.2.4 進(jìn)行相關(guān)性分析,根據(jù)相關(guān)性打分進(jìn)行排序,并返回結(jié)果

    相關(guān)性得分計算有一些公開的比較成熟的方案,比如之前的tf/idf,現(xiàn)在的BM25打分公式等。

    上面就是搜索是兩大模塊式 index,search的主體流程,后面我們逐漸深入lucene的數(shù)據(jù)結(jié)構(gòu)。

    ·

    總結(jié)

    以上是生活随笔為你收集整理的搜索的一般过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。