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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何快速实现高并发短文检索-转

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何快速实现高并发短文检索-转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?2016-06-02?58沈劍?架構師之路

一、需求緣起

某并發量很大,數據量適中的業務線需要實現一個“標題檢索”的功能:

(1)并發量較大,每秒20w次

(2)數據量適中,大概200w數據

(3)是否需要分詞:是

(4)數據是否實時更新:否

?

二、常見潛在解決方案及優劣

(1)數據庫搜索法

具體方法:將標題數據存放在數據庫中,使用like來檢索

優點:方案簡單

缺點:不能實現分詞,并發量扛不住

?

(2)數據庫全文檢索法

具體方法:將標題數據存放在數據庫中,建立全文索引來檢索

優點:方案簡單

缺點:并發量扛不住

?

(3)使用開源方案將索引外置

具體方法:搭建lucene,solr,ES等開源外置索引方案

優點:性能比上面兩種好

缺點:并發量可能有風險,系統比較重,為一個簡單的業務搭建一套這樣的系統成本較高

?

三、58龍哥的建議

問1:龍哥,58同城第一屆編程大賽的題目好像是“黃反詞過濾”,你是冠軍,當時是用DAT來實現的么?

龍哥:是的

畫外音:什么是DAT?

普及:DAT是double array trie的縮寫,是trie樹的一個變體優化數據結構,它在保證trie樹檢索效率的前提下,能大大減少內存的使用,經常用來解決檢索,信息過濾等問題。(具體大伙百度一下“DAT”)

?

問2:上面的業務場景可以使用DAT來實現么?

龍哥:DAT更新數據比較麻煩,不能增量

?

問3:那直接使用trie樹可以么?

龍哥:trie樹比較占內存

畫外音:什么是trie樹?

普及:trie樹,又稱單詞查找樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計,保存大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高。(來源:百度百科)


例如:上面的trie樹就能夠表示{and, as, at, cn, com}這樣5個標題的集合。

?

問4:如果要支持分詞,多個分詞遍歷trie樹,還需要合并對吧?

龍哥:沒錯,每個分詞遍歷一次trie樹,可以得到doc_id的list,多個分詞得到的list合并,就是最終的結果。

?

問5:龍哥,還有什么更好,更輕量級的方案么?

龍哥:用trie樹,數據會膨脹文檔數*標題長度這么多,標題越長,文檔數越多,內存占用越大。有個一個方案,內存量很小,和標題長度無關,非常帥氣。

?

問6:有相關文章么,推薦一篇?

龍哥:可能網上沒有,我簡單說一下吧,核心思想就是“內存hash?+?ID list”

索引初始化步驟為:對所有標題進行分詞,以詞的hash為key,doc_id的集合為value

查詢的步驟為:對查詢詞進行分詞,對分詞進行hash,直接查詢hash表格,獲取doc_id的list,然后多個詞進行合并

=====例子=====

例如:

doc1 :?我愛北京

doc2 :?我愛到家

doc3 :?到家美好

先標題進行分詞

doc1 :?我愛北京?->?我,愛,北京

doc2 :?我愛到家?->?我,愛,到家

doc3 :?到家美好?->?到家,美好

對分詞進行hash,建立hash + ID list

hash(我) -> {doc1, doc2}

hash(愛) -> {doc1, doc2}

hash(北京) -> {doc1}

hash(到家) -> {doc2, doc3}

hash(美好) -> {doc3}

這樣,所有標題的初始化就完畢了,你會發現,數據量和標題的長度沒有關系。

用戶輸入“我愛”,分詞后變為{我,愛},對各個分詞的hash進行內存檢索

hash(我)->{doc1, doc2}

hash(愛)->{doc1, doc2}

然后進行合并,得到最后的查找結果是doc1+doc2。

=====例子END=====

?

問7:這個方法有什么優點呢?

龍哥:存內存操作,能滿足很大的并發,時延也很低,占用內存也不大,實現非常簡單快速

?

問8:有什么不足呢?和傳統搜索有什么區別咧?

龍哥:這是一個快速過度方案,因為索引本身沒有落地,還是需要在數據庫中存儲固化的標題數據,如果不做高可用,數據恢復起來會比較慢。當然做高可用也是很容易的,建立兩份一樣的hash索引即可。另外,沒有做水平切分,但數據量非常非常非常大時,還是要做水平切分改進的。

轉載于:https://www.cnblogs.com/davidwang456/p/7550126.html

總結

以上是生活随笔為你收集整理的如何快速实现高并发短文检索-转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。