本發(fā)明基于分布式數(shù)據(jù)庫和全文搜索引擎領(lǐng)域技術(shù)領(lǐng)域,尤其涉及一種基于分布式數(shù)據(jù)庫的全文搜索引擎。
背景技術(shù):
隨著計(jì)算機(jī)和互聯(lián)網(wǎng)的大力普及和發(fā)展,例如數(shù)千萬用戶每天產(chǎn)生億級別的數(shù)據(jù),迫切需要分布式的存儲和全文搜索工具。目前的方案:文檔和單詞都是按照文檔來進(jìn)行分布式存儲的,查詢的時(shí)候是按照單詞來查詢的,所以需要到所有節(jié)點(diǎn)上查詢。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述的技術(shù)問題,本發(fā)明的設(shè)計(jì)思路是將文檔和單詞分開,按照不同的策略存儲,在查詢的時(shí)候,只需要到單詞所在的節(jié)點(diǎn)進(jìn)行查詢,即本發(fā)明的目的是提供一種能夠提高搜索效率、又具有很強(qiáng)的擴(kuò)展能力的基于分布式數(shù)據(jù)庫的全文搜索引擎。
為了達(dá)到上述的目的,本發(fā)明采用了以下的技術(shù)方案:
本發(fā)明提出一種基于分布式數(shù)據(jù)庫的全文搜索引擎,包括索引和搜索,其中:
索引包括下載文檔、分析文檔、以及將文檔和文檔經(jīng)過分詞后得到的單詞存入分布式數(shù)據(jù)庫;搜索是根據(jù)用戶的輸入,查詢分布式數(shù)據(jù)庫,返回包含用戶輸入的、按照得分進(jìn)行排序的結(jié)果文檔。其中:搜索引擎的絕大部分內(nèi)容都沒有變,變的只是存儲使用了分布式數(shù)據(jù)庫,所以導(dǎo)致索引部分和搜索部分發(fā)生了變化。
作為優(yōu)選:文檔id、文檔內(nèi)容、文檔地址等存入分布式數(shù)據(jù)庫中對應(yīng)節(jié)點(diǎn)的文檔表中,對文檔進(jìn)行分詞和分析,得到單詞id、單詞、單詞所在的文檔id以及單詞的頻率存入到分布式數(shù)據(jù)庫中對應(yīng)節(jié)點(diǎn)的單詞表中。
作為優(yōu)選:文檔id以及單詞id是通過將文檔地址的hash值以及文檔分詞后的每個(gè)單詞的hash值轉(zhuǎn)換為整數(shù)得到,然后對文檔id、單詞id分別對分布式數(shù)據(jù)庫內(nèi)的節(jié)點(diǎn)數(shù)取余數(shù),得到文檔對應(yīng)的節(jié)點(diǎn)id以及單詞對應(yīng)的節(jié)點(diǎn)id。
其中:文檔地址是文檔的標(biāo)識,并非網(wǎng)頁內(nèi)容本身,文檔id是通過文檔地址的hash值轉(zhuǎn)換來的;單詞的內(nèi)容本身是單詞的標(biāo)識,單詞的id通過單詞內(nèi)容本身的hash值轉(zhuǎn)換來的。
作為優(yōu)選:搜索的基本步驟如下:對用戶的輸入進(jìn)行分詞,得到單詞和單詞之間的邏輯關(guān)系,針對每個(gè)單詞到對應(yīng)節(jié)點(diǎn)的單詞表中搜索;
根據(jù)單詞表的文檔id和單詞邏輯關(guān)系計(jì)算結(jié)果文檔id的集合,并且根據(jù)文檔id提取文檔內(nèi)容;同時(shí)相同文檔id內(nèi)所有單詞的頻率逆文檔頻率之和構(gòu)成文檔的得分,文檔按照得分從高到低排名;
其中:單詞的頻率逆文檔頻率為單詞的頻率和語料庫中單詞的逆文檔頻率相乘結(jié)果;
單詞之間的邏輯關(guān)系是指與、或、非、及三種邏輯運(yùn)算的任意組合。
作為優(yōu)選:文檔存儲在分布式數(shù)據(jù)庫相關(guān)節(jié)點(diǎn)的文檔表中,單詞存儲在分布式數(shù)據(jù)庫相關(guān)節(jié)點(diǎn)的單詞表中,單詞的逆文檔頻率存儲在分布式數(shù)據(jù)庫相關(guān)節(jié)點(diǎn)的語料庫表中,其中:文檔與單詞的關(guān)系是:一份文檔是由若干個(gè)單詞組成,將一份文檔進(jìn)行分詞即可得到若干個(gè)單詞;其中:所謂分詞是指將由若干個(gè)單詞組成的一份文檔分為這若干個(gè)單詞。
作為優(yōu)選:分布式數(shù)據(jù)庫中節(jié)點(diǎn)的文檔表基本屬性包括文檔id、文檔地址、文檔內(nèi)容等,文檔表的均衡字段采用文檔id;分布式數(shù)據(jù)庫中節(jié)點(diǎn)的單詞表基本屬性包括單詞id、單詞、單詞所在的文檔id、單詞的頻率,單詞表的均衡字段采用單詞id;
分布式數(shù)據(jù)庫中節(jié)點(diǎn)的語料庫表基本屬性包括單詞id、單詞、單詞的逆文檔頻率,語料庫表的均衡字段采用單詞id。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
本發(fā)明由于采用了以上的技術(shù)方案,從結(jié)構(gòu)上來說,本發(fā)明使用三張表(即單詞表、文檔表和語料庫表),采用不同的均衡字段,單詞表用單詞id分表,文檔表用文檔id分表,語料庫表用單詞id分表,從而在查詢的時(shí)候,按照單詞進(jìn)行查詢,單詞表按照單詞id作為均衡字段,只需要到指定的某些節(jié)點(diǎn)上執(zhí)行即可,其搜索效率大大地提高。
使用了分布式數(shù)據(jù)庫作為存儲介質(zhì),可以利用其強(qiáng)大的緩存和sql計(jì)算功能,另外分布式數(shù)據(jù)庫自身帶有分布式功能,使其具有很強(qiáng)的擴(kuò)展能力。
附圖說明
圖1是本發(fā)明的整體架構(gòu)示意圖;
圖2是本發(fā)明中分布式數(shù)據(jù)庫的架構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明的具體實(shí)施方式做一個(gè)詳細(xì)的說明。
如圖2所示,分布式數(shù)據(jù)庫中節(jié)點(diǎn)的文檔表、單詞表以及語料庫表的設(shè)計(jì),具體如下:
●文檔表
其中:
doc_download_status
為0:表示初始狀態(tài),還沒有開始下載;
為1:表示正在下載,就是說某個(gè)線程查詢時(shí),這個(gè)值為1,則跳過下載;
為2:下載完成的時(shí)候,更新記錄,表示下載完成;此時(shí)下載內(nèi)容,下載時(shí)間也會(huì)更新。
doc_parse_status
為0:表示初始狀態(tài),還沒有開始分析存儲;
為1:表示正在分析存儲,就是說某個(gè)線程查詢時(shí),這個(gè)值為1,則跳過分析存儲;
為2:分析存儲完成的時(shí)候,更新記錄,表示分析存儲完成;此時(shí)分析存儲內(nèi)容,分析存儲時(shí)間也會(huì)更新。
下載時(shí)間和分析存儲時(shí)間是指下載完成的時(shí)間和分析存儲完成的時(shí)間。
●單詞表
●語料庫表
文檔索引過程:包括下載和分析存儲
1、多線程下載過程:
根據(jù)文檔地址得到文檔id,查詢文檔表,看是否有這個(gè)文檔id的記錄
——沒有,插入初始記錄(文檔id,文檔地址,空,空,0,空,0,空),(標(biāo)識11)更新doc_download_status=1,開始下載,看下載是否成功
成功,更新doc_download_status=2,下載內(nèi)容,下載時(shí)間也會(huì)更新
失敗,更新doc_download_status=0,下載內(nèi)容,下載時(shí)間不會(huì)更新——有,查詢doc_download_status的值
0,從(標(biāo)識11)開始
1,跳過這個(gè)文檔的下載
2,看下載時(shí)間是否是定時(shí)更新下載的周期(如一個(gè)月)之前
是,從(標(biāo)識11)開始
否,跳過這個(gè)文檔的下載
2、多線程分析存儲
查詢文檔表中的記錄,查詢doc_parse_status的值
0,(標(biāo)識12)更新doc_parse_status=1,開始分析存儲,看分析存儲是否成功——成功,更新doc_parse_status=2,分析存儲內(nèi)容,分析存儲時(shí)間也會(huì)更新,然后將分析存儲的單詞結(jié)果(單詞id,單詞,文檔id,單詞頻率)插入到單詞表中——失敗,更新doc_parse_status=0,分析存儲內(nèi)容,分析存儲時(shí)間不會(huì)更新
1,跳過這個(gè)文檔的分析存儲
2,看分析存儲時(shí)間是否是定時(shí)更新分析存儲的周期(如一個(gè)月)之前
是,從(標(biāo)識12)開始
否,跳過這個(gè)文檔的分析存儲
文檔搜索過程:
1、如圖1所示,對用戶在搜索客戶端中輸入的關(guān)鍵詞進(jìn)行分詞,得到單詞和單詞之間的邏輯關(guān)系(即與、或、非、及三種邏輯運(yùn)算的任意組合),針對每個(gè)單詞到對應(yīng)節(jié)點(diǎn)的單詞表中搜索;
2、根據(jù)單詞表的文檔id和單詞邏輯關(guān)系計(jì)算結(jié)果文檔id的集合,并且根據(jù)文檔id提取文檔內(nèi)容;按照文檔id進(jìn)行分組,所有單詞的頻率逆文檔頻率之和構(gòu)成文檔的得分,文檔按照得分從高到低排名;其中:單詞的頻率逆文檔頻率為單詞的頻率和語料庫中單詞的逆文檔頻率相乘結(jié)果。
以下結(jié)合具體實(shí)施例子,具體展開本發(fā)明一種基于分布式數(shù)據(jù)庫的全文搜索引擎。
說明
●節(jié)點(diǎn)數(shù)為100,編號從0到99
●爬取的文檔數(shù)為1000萬
●語料庫是基于100億個(gè)文檔建立,建立1000億個(gè)單詞的信息
●文檔的id通過使用文檔地址的md5,取md5的4個(gè)長整數(shù)之和,作為文檔的id
●單詞的id通過計(jì)算單詞的md5,取md5的4個(gè)長整數(shù)之和,作為單詞的id
為了示例,選擇3篇個(gè)文檔和8個(gè)單詞作為演示用
文檔的id和主要單詞的id
索引
文檔表的數(shù)據(jù)如下:
經(jīng)過分詞,統(tǒng)計(jì)單詞的出現(xiàn)次數(shù),得到分詞表的數(shù)據(jù)如下,(出現(xiàn)次數(shù)為0的記錄實(shí)際不存在,僅為說明)
語料庫,收集的文檔數(shù)10億
搜索
例如用戶輸入“機(jī)器學(xué)習(xí)開源“
●第一步對用戶輸入,得到兩個(gè)單詞和單詞之間的關(guān)系
機(jī)器學(xué)習(xí)并且開源
●第二步對每個(gè)單詞進(jìn)行查詢,得到如下的記錄
●第三步,根據(jù)單詞之間的關(guān)系合并文檔,并且計(jì)算每個(gè)文檔的得分(得分=每個(gè)單詞的得分之和,每個(gè)單詞的得分=出現(xiàn)次數(shù)*逆文檔頻率)
●第四步,根據(jù)文檔id查詢文檔內(nèi)容,按照得分從高到低返回給用戶,并且搜索詞高亮顯示
需要強(qiáng)調(diào)的是:以上僅是本發(fā)明的較佳實(shí)施例而已,并非對本發(fā)明作任何形式上的限制,凡是依據(jù)本發(fā)明的技術(shù)實(shí)質(zhì)對以上實(shí)施例所作的任何簡單修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。