摘要:?jiǎn)桚埜纾€有什么更好,更輕量級(jí)的方案么龍哥用樹(shù),數(shù)據(jù)會(huì)膨脹文檔數(shù)標(biāo)題長(zhǎng)度這么多,標(biāo)題越長(zhǎng),文檔數(shù)越多,內(nèi)存占用越大。
一、需求緣起
某并發(fā)量很大,數(shù)據(jù)量適中的業(yè)務(wù)線需要實(shí)現(xiàn)一個(gè)“標(biāo)題檢索”的功能:
(1)并發(fā)量較大,每秒20w次
(2)數(shù)據(jù)量適中,大概200w數(shù)據(jù)
(3)是否需要分詞:是
(4)數(shù)據(jù)是否實(shí)時(shí)更新:否
二、常見(jiàn)潛在解決方案及優(yōu)劣
(1)數(shù)據(jù)庫(kù)搜索法
具體方法:將標(biāo)題數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,使用like來(lái)檢索
優(yōu)點(diǎn):方案簡(jiǎn)單
缺點(diǎn):不能實(shí)現(xiàn)分詞,并發(fā)量扛不住
(2)數(shù)據(jù)庫(kù)全文檢索法
具體方法:將標(biāo)題數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,建立全文索引來(lái)檢索
優(yōu)點(diǎn):方案簡(jiǎn)單
缺點(diǎn):并發(fā)量扛不住
(3)使用開(kāi)源方案將索引外置
具體方法:搭建lucene,solr,ES等開(kāi)源外置索引方案
優(yōu)點(diǎn):性能比上面兩種好
缺點(diǎn):并發(fā)量可能有風(fēng)險(xiǎn),系統(tǒng)比較重,為一個(gè)簡(jiǎn)單的業(yè)務(wù)搭建一套這樣的系統(tǒng)成本較高
三、58龍哥的建議
問(wèn)1:龍哥,58同城第一屆編程大賽的題目好像是“黃反詞過(guò)濾”,你是冠軍,當(dāng)時(shí)是用DAT來(lái)實(shí)現(xiàn)的么?
龍哥:是的
畫(huà)外音:什么是DAT?
普及:DAT是double array trie的縮寫(xiě),是trie樹(shù)的一個(gè)變體優(yōu)化數(shù)據(jù)結(jié)構(gòu),它在保證trie樹(shù)檢索效率的前提下,能大大減少內(nèi)存的使用,經(jīng)常用來(lái)解決檢索,信息過(guò)濾等問(wèn)題。(具體大伙百度一下“DAT”)
問(wèn)2:上面的業(yè)務(wù)場(chǎng)景可以使用DAT來(lái)實(shí)現(xiàn)么?
龍哥:DAT更新數(shù)據(jù)比較麻煩,不能增量
問(wèn)3:那直接使用trie樹(shù)可以么?
龍哥:trie樹(shù)比較占內(nèi)存
畫(huà)外音:什么是trie樹(shù)?
普及:trie樹(shù),又稱單詞查找樹(shù),是一種樹(shù)形結(jié)構(gòu),是一種哈希樹(shù)的變種。典型應(yīng)用是用于統(tǒng)計(jì),保存大量的字符串(但不僅限于字符串),所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計(jì)。它的優(yōu)點(diǎn)是:利用字符串的公共前綴來(lái)減少查詢時(shí)間,最大限度地減少無(wú)謂的字符串比較,查詢效率比哈希樹(shù)高。(來(lái)源:百度百科)
例如:上面的trie樹(shù)就能夠表示{and, as, at, cn, com}這樣5個(gè)標(biāo)題的集合。
問(wèn)4:如果要支持分詞,多個(gè)分詞遍歷trie樹(shù),還需要合并對(duì)吧?
龍哥:沒(méi)錯(cuò),每個(gè)分詞遍歷一次trie樹(shù),可以得到doc_id的list,多個(gè)分詞得到的list合并,就是最終的結(jié)果。
問(wèn)5:龍哥,還有什么更好,更輕量級(jí)的方案么?
龍哥:用trie樹(shù),數(shù)據(jù)會(huì)膨脹文檔數(shù)*標(biāo)題長(zhǎng)度這么多,標(biāo)題越長(zhǎng),文檔數(shù)越多,內(nèi)存占用越大。有個(gè)一個(gè)方案,內(nèi)存量很小,和標(biāo)題長(zhǎng)度無(wú)關(guān),非常帥氣。
問(wèn)6:有相關(guān)文章么,推薦一篇?
龍哥:可能網(wǎng)上沒(méi)有,我簡(jiǎn)單說(shuō)一下吧,核心思想就是“內(nèi)存hash + ID list”
索引初始化步驟為:對(duì)所有標(biāo)題進(jìn)行分詞,以詞的hash為key,doc_id的集合為value
查詢的步驟為:對(duì)查詢?cè)~進(jìn)行分詞,對(duì)分詞進(jìn)行hash,直接查詢hash表格,獲取doc_id的list,然后多個(gè)詞進(jìn)行合并
=====例子=====
例如:
doc1 : 我愛(ài)北京
doc2 : 我愛(ài)到家
doc3 : 到家美好
先標(biāo)題進(jìn)行分詞:
doc1 : 我愛(ài)北京 -> 我,愛(ài),北京
doc2 : 我愛(ài)到家 -> 我,愛(ài),到家
doc3 : 到家美好 -> 到家,美好
對(duì)分詞進(jìn)行hash,建立hash + ID list:
hash(我) -> {doc1, doc2}
hash(愛(ài)) -> {doc1, doc2}
hash(北京) -> {doc1}
hash(到家) -> {doc2, doc3}
hash(美好) -> {doc3}
這樣,所有標(biāo)題的初始化就完畢了,你會(huì)發(fā)現(xiàn),數(shù)據(jù)量和標(biāo)題的長(zhǎng)度沒(méi)有關(guān)系。
用戶輸入“我愛(ài)”,分詞后變?yōu)閧我,愛(ài)},對(duì)各個(gè)分詞的hash進(jìn)行內(nèi)存檢索
hash(我)->{doc1, doc2}
hash(愛(ài))->{doc1, doc2}
然后進(jìn)行合并,得到最后的查找結(jié)果是doc1+doc2。
=====例子END=====
問(wèn)7:這個(gè)方法有什么優(yōu)點(diǎn)呢?
龍哥:存內(nèi)存操作,能滿足很大的并發(fā),時(shí)延也很低,占用內(nèi)存也不大,實(shí)現(xiàn)非常簡(jiǎn)單快速
問(wèn)8:有什么不足呢?和傳統(tǒng)搜索有什么區(qū)別咧?
龍哥:這是一個(gè)快速過(guò)度方案,因?yàn)樗饕旧頉](méi)有落地,還是需要在數(shù)據(jù)庫(kù)中存儲(chǔ)固化的標(biāo)題數(shù)據(jù),如果不做高可用,數(shù)據(jù)恢復(fù)起來(lái)會(huì)比較慢。當(dāng)然做高可用也是很容易的,建立兩份一樣的hash索引即可。另外,沒(méi)有做水平切分,但數(shù)據(jù)量非常非常非常大時(shí),還是要做水平切分改進(jìn)的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/25917.html
摘要:優(yōu)志愿張海鵬宋體背景宋體每年月下旬到月下旬期間是高考填志愿的高峰期,也是優(yōu)志愿后端面臨大流量高并發(fā)請(qǐng)求的業(yè)務(wù)高峰期。對(duì)于優(yōu)志愿讀多寫(xiě)少的場(chǎng)景及其業(yè)務(wù)高峰期,用戶可以按需增刪節(jié)點(diǎn),更好地實(shí)現(xiàn)讀取性能的擴(kuò)展。 隨著用戶規(guī)模的增長(zhǎng),數(shù)據(jù)庫(kù)的壓力也在成倍增加。面對(duì)大流量、高并發(fā),UCloud MongoDB 做到了高效,并展現(xiàn)出了更好的性能體驗(yàn)。 —— 優(yōu)志愿 CTO 張海鵬 背景...
摘要:量化派是一家數(shù)據(jù)驅(qū)動(dòng)的科技金融公司,通過(guò)人工智能大數(shù)據(jù)機(jī)器學(xué)習(xí)等前沿技術(shù)提供消費(fèi)信貸撮合及消費(fèi)場(chǎng)景下的白條服務(wù),每年處理千萬(wàn)級(jí)用戶信用及信用消費(fèi)申請(qǐng)。 「小楊」最近裝修房子,準(zhǔn)備去銀行貸款,但是聽(tīng)說(shuō)好多人會(huì)因?yàn)閭€(gè)人征信問(wèn)題被銀行拒絕貸款!于是,他先查了一下自己的央行征信,發(fā)現(xiàn)竟然沒(méi)有自己的征信信息,「小楊」陷入了沉思,自己經(jīng)常在淘寶、jd 上買東西,也有淘寶花唄和京東白條,怎么會(huì)沒(méi)有征...
摘要:架構(gòu)演進(jìn)單機(jī)架構(gòu)以淘寶作為例子。隨著用戶數(shù)的增長(zhǎng),并發(fā)讀寫(xiě)數(shù)據(jù)庫(kù)成為瓶頸第二次演進(jìn)引入本地緩存和分布式緩存在同服務(wù)器上或同中增加本地緩存,并在外部增加分布式緩存,緩存熱門商品信息或熱門商品的頁(yè)面等。 1. 概述 本文以淘寶作為例子,介紹從一百個(gè)并發(fā)到千萬(wàn)級(jí)并發(fā)情況下服務(wù)端的架構(gòu)的演進(jìn)過(guò)程,同時(shí)列舉出每個(gè)演進(jìn)階段會(huì)遇到的相關(guān)技術(shù),讓大家對(duì)架構(gòu)的演進(jìn)有一個(gè)整體的認(rèn)知,文章最后匯總了一些架構(gòu)...
閱讀 1254·2021-11-08 13:25
閱讀 1447·2021-10-13 09:40
閱讀 2779·2021-09-28 09:35
閱讀 743·2021-09-23 11:54
閱讀 1135·2021-09-02 15:11
閱讀 2438·2019-08-30 13:18
閱讀 1675·2019-08-30 12:51
閱讀 2694·2019-08-29 18:39