1.明白爲何須要搜索引擎。
2.明白搜索引擎技術是什麼、用來解決什麼問題(場景)的。明白何時該用它。
3.明白搜索引擎是怎麼解決問題的,熟悉搜索引擎的核心概念、工做流程、原理。
4.瞭解市面上經常使用的搜索引擎框架html
問題1:咱們的應用中通常用什麼來存儲數據?java
問題2:咱們常常瀏覽新聞、博客、商品,存儲這些數據的表都應有哪些字段?程序員
它們至少有下面這些字段web
問題3:在數據庫中如何作查詢?以新聞表爲例數據庫
按類別查
按時間查
按標題模糊查詢,查詢標題與釣魚島有關的新聞
按關鍵字查詢 ,如查詢與蒼老師有關的新聞api
問題4:當數據量變大時,這四個查詢都變慢了,該如何優化?restful
經常使用的數據庫優化方法:網絡
1.建索引 2.分區表架構
問題5:建索引對 「查詢標題與釣魚島有關的新聞」 和 「查詢與蒼老師有關的新聞」 有效果嗎?框架
問題6:索引的原理是怎樣的?
問題7:索引的排序,是怎麼排的?
1.數值列 2.時間列 3.文本列
問題8:在新聞標題列上建索引,當咱們查詢 標題 = ‘釣魚島’,數據庫會怎麼去查? 而當咱們查詢 標題 LIKE ‘%釣魚島%’ ,數據庫該如何去查?
問題9:在數據庫中如何判斷一個列是否能夠建索引?
基本原則:
表常常被訪問,且數據量很大,而每次查詢的數據只佔很小很小一部分
列的數據值分佈範圍普遍
列中包含大量空值
列被常常用在查詢條件中(不能是包含在表達式中)
文本列需特殊考慮:常常是用做模糊查詢,則不適合建索引。精確查詢則可。
問題10:若是要對查詢出來的結果進行相關度排名,數據庫可否作到?
如:要查詢 蒼老師、tony、火鍋有關的新聞:含有三個關鍵字(相關度最高)的新聞排前面含兩個關鍵字(相關度次之),排次之含一個關鍵字 的,排次次之。若是要對搜索的新聞字段設置不一樣的權重,好比新聞標題中包含這三個關鍵字的新聞的相關性就遠高於新聞內容中包含這三個字。數據庫可否作到?
理論學習
結構化數據: 用表、字段表示的數據
半結構化數據: xml html
非結構化數據: 文本、文檔、圖片、音頻、視頻等
結論:數據庫適合結構化數據的精確查詢,而不適合半結構化、非結構化數據的模糊查詢及靈活搜索(特別是數據量大時),沒法提供想要的實時性。
問題11:建索引對錶的增、刪、改操做有效率影響沒?
因此爲何須要搜索引擎?
結論:數據庫適合結構化數據的精確查詢,而不適合半結構化、非結構化數據的模糊查詢及靈活搜索(特別是數據量大時),沒法提供想要的實時性。
分析:咱們查詢時,輸入的是蒼老師,想要獲得標題或內容中包含「蒼老師」的新聞列表。
若是標題、內容列上都有一個這樣的索引,裏面能快速找到與蒼老師關鍵字對應的文章id,再根據文章id就能夠快速找到文章了。
問題1:你以爲這個索引的結構是怎樣的?
問題2:爲何稱爲倒排索引?
英文原名Inverted index,失敗地被翻譯成了倒排索引。 而應該翻譯爲:反向索引
問題3:下面這兩個索引能夠合併在一塊兒嗎?
問題4:反向索引的記錄數會不會很大?
若是是英文的,最大是多少? 若是是中文的,最大多是多少?
結論:量不會很大,30萬之內;經過這個索引找文章會很快。
問題5:如何創建這樣一個索引?
數據示例
新聞id:1
新聞標題:Tony 與蒼老師一塊兒吃火鍋
新聞內容:2018年4月1日,Tony 在四川成都出席某活動時,碰巧主辦方也邀請了蒼老師來提升人氣,在主辦方的邀請下和蒼老師一塊兒吃了個火鍋,很爽!
怎樣爲上面的新聞文章創建反向索引?
一句話怎麼分紅多個詞?人能分,計算機能不能分?
若是是英文文章,好很差分? It’s one thing to find the 10 best documents to match your query
英文好分(有空格),中文則很差分。 但必定得要分,不然沒法創建反向索引。
就必須寫一套專門的程序來作這個事情:分詞器
問題6:分詞器與天然語言的關係是怎樣?
每門語言有對應的分詞器
問題7:若是要開發一箇中文分詞器,你以爲該怎麼實現對一句話進行分詞?
語句示例:張三說的確實在理。
分析
機器不會分,而咱們人會分。
問1:咱們人是怎麼分的?
從頭開始一個一個字讀,經過先後字的組合,分出:張3、說的、確實、在理
問2:咱們是怎麼肯定張3、說的、確實是詞?
由於咱們的大腦裏有個詞的字典,經過與字典匹配,而肯定。
問3:爲何咱們不會分出:張3、說的、的確、確實、實在、在理?
由於咱們的大腦能夠進行歧義分析。
中文分詞器原理:有個詞的字典,對語句先後字進行組合,與字典匹配,歧義分析
問題8: java開源中文分詞器有哪些?
百度:中文分詞器
有不少,如何選擇?
準確率 分詞效率 中英文混合分詞支持
經常使用中文分詞器
IKAnalyzer mmseg4j
專業的商用分詞器,在詞典匹配的基礎上加入統計以及機器學習、人工標註。 能很好處理歧義和未登陸詞問題,分詞速度慢些。 百度、谷歌
問題9: 分詞器在分詞時能不能統計出詞的出現次數、位置?
這兩個數值有什麼用?
問題10: 你、我、他、的、地、了、標點符號…..這些須要爲其建立索引嗎?
這些詞稱爲:停用詞。分詞器支持指定/添加停用詞
問題11: 當出現了新詞了,該怎麼辦?
分詞器應支持爲其詞典添加新詞。
根據分詞結果,咱們建立反向索引,以下所示:
結論:使用分詞器對數據進行分詞,建立反向索引。
如想搜索與 「tony OR 蒼老師」 相關的新聞 步驟是怎樣的?
步驟1: 對搜索輸入進行分詞
tony 、蒼老師
步驟2: 在反向索引中找出包含tony、蒼老師的文章列表
步驟3: 合併兩個列表,排序輸出
{1,12,8,5}
問題1:合併後列表該如何排序?
咱們但願最相關的排在最前面
問題2: 相關性如何度量?
問1:咱們是如何肯定相關的?
包含要找的詞
問2:如何肯定更相關?
人能夠經過讀內容斷定相關性,機器不懂人話。
得創建一套能評估相關性的模型。
咱們前面在分詞器中統計出的詞的出現次數,能夠用來創建這個模型嗎?評判的規則怎麼定?
利用出現次數來創建模型
規則1: 統計出現次數,根據次數從高到低排
{{1,5},{5,3},{12,1},{8,1}}
問題1:標題中出現蒼老師,與新聞的內容中出現蒼老師,哪一個是專門寫蒼老師的相關度高些?怎麼作
規則2: 加入權重,標題權重10,內容權重1,計算權重得分,按高-低排序
{{1,23},{12,10},{5,3},{8,1}}
這個相關性模型很簡單。有時排序會不很準確。
複雜的相關性計算模型有:
tf-idf 詞頻-逆文檔率模型
向量空間模型
貝葉斯機率模型,如: BM25
搜索引擎中會提供一種、或多種實現供選擇使用,也會提供擴展。電商網站中的搜索相關性計算會考慮更多,更復雜。
更新狀況分析:
問1:新增時,須要怎麼更新?
問2:刪除時,須要怎麼更新?
問3:修改時,須要怎麼更新?
思考1:實時更新在什麼狀況下可作,什麼狀況下不可作?什麼狀況下必須得作?
思考2:搜索引擎巨頭百度、谷歌,它們的網頁搜索的反向索引是更新仍是重建?
反向索引會有多大?
如 類別 IN () 數值 > = < 時間
一、搜索引擎是什麼?
一套可對大量結構化、半結構化數據、非結構化文本類數據進行實時搜索的專門軟件
最先應用於信息檢索領域,經谷歌、百度等公司推出網頁搜索而爲大衆廣知。後又被各大電商網站採用來作網站的商品搜索。現普遍應用於各行業、互聯網應用。是大型系統、網站架構師必備技能。
二、搜索引擎是用來解決什麼問題的?
專門解決大量結構化、半結構化數據、非結構化文本類數據的實時檢索問題。 這種實時搜索數據庫作不了。
三、搜索引擎適合什麼場景使用?
大量結構化、半結構化、非結構化文本類數據的實時搜索
信息檢索(如電子圖書館、電子檔案館)
網頁搜索
內容提供網站的內容搜索(如 新聞、論壇、博客網站)
電子商務網站的商品搜索
若是你負責的系統數據量大,經過數據庫檢索慢,能夠考慮用搜索引擎來專門負責檢索。
四、搜索引擎由哪些核心部件構成?
數據源
分詞器
反向索引(倒排索引)
相關性計算模型
五、搜索引擎的工做原理是怎樣的?
一、從數據源加載數據,分詞、創建反向索引
二、搜索時,對搜索輸入進行分詞,查找反向索引
三、計算相關性,排序,輸出
六、要實現一個搜索引擎,須要實現哪些?
一、分詞器
二、反向索引,索引存儲
三、相關性計算模型
七、要去使用一個搜索引擎,須要搞清楚它的哪些方面?
一、分詞器
二、反向索引創建、存儲、更新
三、相關性計算模型
八、java領域應用普遍的開源搜索引擎組件、系統
Lucene:Apache頂級開源項目,Lucene-core是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的框架,提供了完整的查詢引擎和索引引擎,部分文本分詞引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文檢索引擎。
Nutch:Apache頂級開源項目,包含網絡爬蟲和搜索引擎(基於lucene)的系統(同百度、google)。Hadoop因它而生。
Solr:Lucene下的子項目,基於Lucene構建的獨立的企業級開源搜索平臺,一個服務。它提供了基於xml/JSON/http的api供外界訪問,還有web管理界面。
Elasticsearch:基於Lucene的企業級分佈式搜索平臺,它對外提供restful-web接口,讓程序員能夠輕鬆、方便使用搜索平臺,而不須要了解Lucene。
問:如何選擇搜索引擎組件或系統?
當作熟度,使用企業量。