無論是在內(nèi)部系統(tǒng)還是在外部的互聯(lián)網(wǎng)站上腺律,都少不了檢索系統(tǒng)臭觉。數(shù)據(jù)是為了用戶而服務(wù)。計算機在采集數(shù)據(jù)疮绷,處理數(shù)據(jù)莉擒,存儲數(shù)據(jù)之后澜躺,各種客戶端的操作pc機或者是移動嵌入式設(shè)備都可以很好的獲取數(shù)據(jù)吼虎,得到 想要的數(shù)據(jù)服務(wù)。
檢索分為SQL過濾查詢和全文檢索喜颁。數(shù)據(jù)都是放在數(shù)據(jù)庫里,數(shù)據(jù)庫里的數(shù)據(jù)量太大盛嘿,要檢索到精準的數(shù)據(jù)是需要很好的用戶體驗洛巢。用戶對響應(yīng)時長要求特別嚴格括袒,最好控制在一定的響應(yīng)時間內(nèi)次兆。SQL查詢是普通的字段過濾,一般在沒有走全表掃描的情況下都是性能較好的數(shù)據(jù)查詢方式锹锰。全文檢索的實現(xiàn)方式是在數(shù)據(jù)庫設(shè)計的時候就有這些模塊芥炭,比如MySQL的全文檢索。之后在市面上有公司開發(fā)了成型的開源產(chǎn)品恃慧,比如Lucene等园蝠。??? 學(xué)過luncene框架,? 能就是論事痢士。在銀行工作的時候有接觸過es框架彪薛,到現(xiàn)在也沒仔細去弄懂。每個人的學(xué)習(xí)能力不一樣怠蹂,有的工程師削尖了腦袋要去專研每個技術(shù)善延。??? 是在學(xué)習(xí)Java開發(fā)框架的時候接觸過Lucene框架, 跟著源碼敲了一遍那個搜索引擎城侧。對于那種根據(jù)分詞查詢數(shù)據(jù)的方式有深刻的映像易遣,但是并不是每個系統(tǒng)都是要使用全文檢索分詞搜索。
按需開發(fā)嫌佑,意思就是根據(jù)需求進行商業(yè)開發(fā)豆茫。以用戶體驗為中心,金錢盈利為目的屋摇。沒有誰在為做無用功揩魂,得到與失去,不要去說炮温,也說不準肤京。像普通的字段搜索看起來十分簡單,其實就是很簡單茅特。但是如果遇到數(shù)據(jù)量大的情況忘分,或者是用戶不會使用系統(tǒng)的情況下,都是有問題的白修。像百度妒峦,Google,搜什么就有什么兵睛,這就是全文檢索肯骇。
搜索窥浪,依賴于搜索引擎。搜索引擎的建立是十分困難的事情笛丙。以? 現(xiàn)在的水平理解的搜索漾脂,? 能說個大概。? 做Java
6年時間胚鸯,雖然沒有寫過搜索引擎骨稿,但是沒有經(jīng)驗的同學(xué)可以去嘗試著實踐下。做任何系統(tǒng)都是需要構(gòu)建bs架構(gòu)或者是cs架構(gòu)姜钳,cs架構(gòu)是client-server架構(gòu)坦冠。
在操作系統(tǒng)中有客戶端軟件開發(fā)包,bs架構(gòu)是broswer-server架構(gòu)哥桥,在所有的數(shù)據(jù)操作都是在瀏覽器中實現(xiàn)辙浑,把瀏覽器當(dāng)做一個子系統(tǒng),子系統(tǒng)上面又有很多應(yīng)用程序... bs架構(gòu)是特殊的cs架構(gòu)拟糕。
在大學(xué)學(xué)習(xí)計算機編程開發(fā)判呕,首選的語言是C++。那種語言是寫客戶端軟件送滞, 也是學(xué)的很糾結(jié)侠草,以為沒有很好的效果。大三休學(xué)的時候?qū)W習(xí)了Java累澡,接觸全文檢索梦抢,學(xué)習(xí)了前端頁面的設(shè)計開發(fā),后臺數(shù)據(jù)庫的建立愧哟。到現(xiàn)在有更多的想法和思考奥吩。爬蟲的建立,爬蟲是怎么從網(wǎng)站上爬數(shù)據(jù)蕊梧,用戶是怎么在網(wǎng)站上面搜索數(shù)據(jù)霞赫。
大學(xué)畢業(yè)之后對于搜索引擎的理解畫了個草圖
像? 爬蟲
一般的java IDE的debug是這樣設(shè)計
爬蟲是怎么在網(wǎng)站上爬數(shù)據(jù),為什么? 能爬網(wǎng)站的數(shù)據(jù)》适福現(xiàn)在的web瀏覽器都支持HTML標簽編輯的網(wǎng)頁端衰,HTML標簽頁是dom元素。每個DOM元素都是一個實體對象甘改,在數(shù)據(jù)庫中體現(xiàn)的就是dom元素實體對象表旅东。Dom元素表里存放的就是網(wǎng)頁標簽所承載的基礎(chǔ)數(shù)據(jù)和一些基本屬性。每當(dāng)一個網(wǎng)站上面的標簽包裹的數(shù)據(jù)發(fā)生變化十艾,就要觸發(fā)數(shù)據(jù)寫write事件抵代,即 WriteEventListener,更新索引庫里的索引數(shù)據(jù)忘嫉,和文檔庫里的文檔數(shù)據(jù)荤牍。這種數(shù)據(jù)更新同步方式叫做即時同步方式案腺,是的數(shù)據(jù)庫里的數(shù)據(jù)和索引庫里的數(shù)據(jù)保持一致性。用戶查詢數(shù)據(jù)的時候總能查到最新的數(shù)據(jù)康吵,用戶查數(shù)據(jù)都是走索引庫再走文檔庫劈榨,這樣性能更好。
至于怎么構(gòu)建dom元素數(shù)據(jù)庫晦嵌,怎么構(gòu)建dom元素索引庫同辣。那些都是商業(yè)庫,需要開發(fā)注冊維護耍铜,就像?? 在某個地方開商店一樣邑闺,需要辦理很多手續(xù)跌前。
當(dāng)時學(xué)習(xí)操作lucene 框架架構(gòu)方式是通過AOP的方式實現(xiàn)數(shù)據(jù)同步棕兼。數(shù)據(jù)同步是文檔庫和索引庫的同步操作方式。文檔庫存放的是Document 文檔對象抵乓,索引庫存放的是字段對象 Field 伴挚。字段對象分為索引文檔號和經(jīng)歷過分詞器分詞之后的關(guān)鍵字集合。中文分詞器是Analyzer 堆中文的語句進行分詞灾炭。
中文的分詞器對中文語句的此法進行分析茎芋。中文的語句分為主+謂+賓+定+狀+補 . 分詞器分為標準的國際分詞器和中國大陸簡體的中文分詞器。原理十分相似蜈出,實詞和虛詞需要區(qū)分田弥。實詞是名詞,虛詞是冠詞铡原,語氣詞偷厦,稱謂詞燕刻,形容詞卵洗,狀態(tài)詞,補語詞本橙,謂語詞。分詞器分析網(wǎng)站上面的文章關(guān)鍵字片择,中文摘要,具體的文章正文內(nèi)容。分詞器的分詞結(jié)果生成關(guān)鍵字和文檔索引組裝成的字段 Field對象。字段對象集合 fieldList 放在lucene 索引庫中。文檔庫中存放大量的文檔對象,文檔Document 與 字段 Field 對象的索引表中的文檔索引關(guān)聯(lián)罪既。
用戶在前端使用日用語句在lucene搜索引擎中搜索數(shù)據(jù)集合的過程十分復(fù)雜猩谊。簡單的過程可以分為
查詢語句詞的錄入接收。
后臺對中文查詢語句分詞,抽取關(guān)鍵字形成關(guān)鍵字集合棒口。
使用關(guān)鍵字集合在lucene索引庫 中的關(guān)鍵字進行匹配厂抖,匹配成功會有文檔集合 documentList 。
文檔集合返回給業(yè)務(wù)邏輯層service . 使用高亮器hlighter 對文檔中的存在的關(guān)鍵詞高亮克懊。
文檔集合的返回通過評分對象score 綜合得分排序忱辅。
命中文檔的得分 score 有默認的得分規(guī)則和自定義得分規(guī)則。
數(shù)據(jù)同步在企業(yè)項目中使用很多谭溉。平安集團的hrx人力資源管理系統(tǒng)使用Elasticsearch 搜索引擎搜索數(shù)據(jù)墙懂。Lucene 和 Elasticsearch 兩種引擎搜索數(shù)據(jù)的方式都是全文檢索。全文檢索在數(shù)據(jù)庫軟件中普遍存在扮念。企業(yè)的IDE 開發(fā)環(huán)境有搜索框的地方或許會有全文檢索的影子损搬。軟件和應(yīng)用程序系統(tǒng)都有數(shù)據(jù)。檢索方式分為通過表單的方式和一個表單輸入框的方式扔亥。一個表單輸入框的輸入方式面向的用戶是大眾化的互聯(lián)網(wǎng)網(wǎng)名场躯。Java 的web信息系統(tǒng)安全新能和開發(fā)維護團隊有保障谈为,使用sql 查詢語句查找數(shù)據(jù)的方式限制用戶量旅挤。內(nèi)部系統(tǒng)的用戶量分為內(nèi)部用戶和外圍用戶。使用sql查詢語句查詢數(shù)據(jù)使用全文檢索索引庫和文檔庫伞鲫。數(shù)據(jù)查詢是否全表還是走索引表有用戶自定義粘茄,系統(tǒng)默認,AI 算法相應(yīng)的操作模式秕脓。
數(shù)據(jù)同步索引庫和文檔庫中的數(shù)據(jù)柒瓣。同步平安銀行ES庫和PJ 庫中的數(shù)據(jù)。開發(fā)任務(wù)涉及到項目不同版本發(fā)布的同步數(shù)據(jù)代碼吠架。數(shù)據(jù)量大小和性能問題對于開發(fā)工程師是更高級別的操作芙贫。保證數(shù)據(jù)的正確性,代碼的質(zhì)量高低傍药。項目組之間的工程師都會相互借閱不同開發(fā)分支的代碼磺平。每個開發(fā)都會有不同的編寫代碼的方式。
Elasticsearch 搜索原理和Lucene 類似拐辽。每個企業(yè)采用的技術(shù)架構(gòu)選型不盡相同拣挪。