[TOC]html
本文爲閱讀《這就是搜索引擎:核心技術詳解》的讀書筆記java
搜索引擎是互聯網重要的組成部分,搜索引擎技術也是當前解決信息過載問題主要的手段git
能夠按照使用的技術將搜索引擎的發展分爲四個階段:github
iphone 11
搜索引擎的目標是:更全、更快、更準web
所謂的暗網指的是那些存儲在數據庫裏,不能經過超連接訪問的資源集合。簡單點說所謂的暗網就是不能或者很難被搜索引擎收錄的網絡資源。攜程的機票數據須要經過組合的方式才能查詢出來,對於網絡爬蟲而言這個過程難以實現自動化,普通的暴力抓取將對被抓網站帶來較大的壓力並且效率很是低下算法
暗網爬蟲的技術難點有兩個:數據庫
上面兩個技術難點有部分解決方案,能夠參考《這就是搜索引擎》的第 2.6 節windows
索引是搜索引擎的核心技術之一,是搜索引擎快速查找的基礎服務器
單詞文檔矩陣用來表示某一個文檔中是否存在某一個單詞,例如:restful
文檔 1 | 文檔 2 | ... | 文檔 n | |
---|---|---|---|---|
詞彙 1 | 包含 | 不包含 | ||
... | ... | ... | ... | ... |
詞彙 n | 包含 | ... |
在英文的行文中,單詞之間是以空格做爲天然分界符的,而中文只有字、句和段能經過明顯的分界符來簡單劃界,而詞沒有一個形式上的分界符,分詞處理就是將連續的字序列按照必定的規範從新組合成詞序列的過程
單詞是搜索引擎的基本搜索元素,爲了建立單詞文檔矩陣,須要先使用分詞系統提取文檔中全部的單詞
文檔的分詞處理是天然語言處理(NLP)的核心工具之一,而 NLP 則是大數據時代極爲重要的工具。本文不對分詞算法作介紹,詳細信息能夠參考其餘文檔
文檔編號 | 文檔內容 |
---|---|
1 | 谷歌地圖之父跳槽Facebook |
2 | 谷歌地圖之父加盟Facebook |
3 | 谷歌地圖創始人拉斯離開谷歌加盟Facebook |
4 | 谷歌地圖之父跳槽Facebook與Wave項目取消有關 |
5 | 谷歌地圖之父拉斯加盟社交網站Facebook |
單詞 ID | 單詞 | 文檔頻率 | 倒排列表(文檔編號、詞頻、位置) |
---|---|---|---|
1 | 谷歌 | 5 | (1;1;<1>),(2;1;<1>),(3;2;<1;6>),(4;1;<1>),(5;1;<1>) |
2 | 創始人 | 1 | (3;1;<3>) |
... | ... | ... | ... |
單詞「谷歌」出如今了 5 個文檔中,而且在第三個文檔中出現了 2 次,分別在文檔第一個單詞處和第 6 個單詞處
常見的索引創建方法有三種:兩遍文檔法、排序法和歸併法,比較經常使用的是歸併算法
在數據量大到不能使用內存存儲時只能使用外排算法:歸併
搜索動態變化的文檔集合時須要建立動態索引,此時系統中有三個關鍵部分:倒排索引、臨時索引和已刪除文檔列表
變化的文檔會先創建臨時索引。文檔的更新按照刪除&從新添加進行處理,刪除的文檔須要在刪除文檔列表中進行維護,返回查詢結果時須要使用刪除文檔列表過濾查詢結果。
索引更新有多種策略:徹底重構、再合併、原地更新及混合策略,具體解釋參考原書 3.6 節。與爬蟲策略相似,不一樣屬性的單詞其索引更新策略也能夠不一樣
有些文檔有必定的結構,例如郵件有發件人、收件人、標題和正文等,有些搜索指明瞭搜索結構文檔中的某一部分,例如只在收件人列表中搜索。實現多字段索引須要使用必定途徑得到文檔的結構信息和單詞與文檔結構間的信息
多字段索引常見三種方法:
對於搜索引擎而言創建分佈式索引的方案有兩種:按文檔劃分、按單詞劃分
按文檔劃分就是全部機器的功能都是相同的,不一樣機器對不一樣文檔創建索引,每次查詢的時候會發廣播給全部機器
按單詞劃分則不一樣機器對不一樣的單詞創建索引,一次查詢只會涉及到部分機器
經常使用的方法是按文檔進行索引,由於按單詞進行索引有如下缺點:
索引創建以後就可使用索引來查詢了,使用索引進行查詢有兩大類方法:一次一文檔、一次一單詞
查詢的目的在於得到與查詢信息相關的文檔,若是查詢結果有多個,還需對結果文檔按照相關度進行排序。對文檔相關度的計算能夠從兩個角度進行,一種是計算完一個文檔後再計算另外一個文檔,另外一種是先計算每一個文檔關於某個單詞的相關度得分,最後把得分累加,即爲文檔的最終得分
一次一文檔
以倒排列表中包含的文檔爲單位,每次計算一個文檔和查詢字段的最終類似性,而後計算餘下文檔,最後對文檔得分進行排序
一次一單詞
以查詢單詞爲單位,每次查詢一個文檔關於一個單詞的得分,查詢完一個單詞所涉及的全部文檔後再查下一個單詞。累加全部單詞得分即爲文檔的最終得分
常見的短語查詢方法
位置信息索引方式很直觀,單詞在文檔中出現的順序和短信中的順序相同即認爲匹配,但當短信中包含的單詞比較多時效率不高
雙詞索引在常見的雙詞短信中的兩個單詞之間創建鏈接,能夠經過雙詞的首詞快速的找到下詞。雙詞索引會消耗大量的存儲空間,故通常只對常見短語使用這種方式
短語索引就是將短語看成單詞看待併爲其創建索引,短語索引通常須要結合數據挖掘來得到熱門短語
短語亦有屬性與類別,不一樣屬性的短信可使用不一樣的索引方式
布爾模型是檢索模型中最簡單的一種,其數學基礎是集合論。在布爾模型中,文檔與用戶查詢由其包含的單詞集合來表示,二者 的類似性則經過布爾代數運算來進行斷定,例如:Query = apple AND ( Jobs OR Ipad2 )
,單詞文檔矩陣結果爲 true 時返回對應的文檔 ID
常見的方式是以單詞做爲特徵,使用 t 維帶權重向量表示一個文檔。檢索時將用戶查詢信息也當作一個特殊的文檔亦轉化爲特徵向量,使用向量距離度量查詢與文檔的相關性
機率檢索模型是當前效果最好的模型之一,大部分商用搜索引擎都使用這種方式。BM25 是當前效果最好的機率搜索模型
看完貝葉斯以後再看一遍
判斷由文檔生成用戶查詢的可能性有多大,而後按照這種生成機率由高到低排序,做爲搜索結果
當排序因子比較多時使用機器學習方法較好
用戶點擊能夠看作是一種標籤,點擊率高說明當前頁面和查詢相關性高
搜索引擎在檢索信息時經常使用的兩大特徵:
網頁和查詢的相關性
網頁的重要性
入鏈、出鏈、錨文字
PageRank 算法主要使用網頁的入鏈(個數與質量)做爲依據來給網頁打分,PageRank 算法與用戶查詢無關
其餘改進算法:
HITS 算法有兩個主要的概念: Hub 頁面和 Authority 頁面。Authority 頁面指與某個領域或者話題相關度高的網頁,例如與視頻相關度高的網頁有騰訊視頻、優酷視頻等;Hub 頁面指的是包含不少出鏈指向高質量 Authority 頁面的頁面。HITS 算法在海量網頁中找到與用戶查詢主題相關的高質量 Authority 頁面和 Hub 頁面並以此爲結果返回給用戶
HITS 算法與用戶查詢密切相關
SALSA 和 Hilltop 算法是 PageRank 和 HITS 算法的結合與改進
關鍵詞重複、網頁標題做弊、網頁重要標籤做弊、內容農場等
連接農場、google 轟炸(精心設計錨文字)、連接購買等
用戶看見的內容和搜索引擎收錄的內容不一樣,例如 IP 地址做弊、頁面內容隱藏等
web 2.0 指的是一個利用 Web 平臺,由用戶主導而生成內容的互聯網產品模式,區別傳統(web 1.0)由網站僱員主導生成內容的互聯網模式
常見做弊手段有:博客做弊、點評做弊、微博做弊等
信任傳播模型(信任知網,則檢索知網全部內容)、不信任傳播模型(剔除部分不可靠的網站)、異常發現模型、綜合模型等
分析用戶意圖以向用戶展現更準確的搜索內容
常見手段:
Lucene (['lu:si:n]
) 是基於 java 的開源全文索引工具包
本文內容參考 how2j,感謝~
// 1. 準備中文分詞器 IKAnalyzer analyzer = new IKAnalyzer(); // 2. 使用測試數據建立索引 List<String> productNames = new ArrayList<>(); productNames.add("飛利浦led燈泡e27螺口暖白球泡燈家用照明超亮節能燈泡轉色溫燈泡"); productNames.add("飛利浦led燈泡e14螺口蠟燭燈泡3W尖泡拉尾節能燈泡暖黃光源Lamp"); productNames.add("雷士照明 LED燈泡 e27大螺口節能燈3W球泡燈 Lamp led節能燈泡"); productNames.add("飛利浦 led燈泡 e27螺口家用3w暖白球泡燈節能燈5W燈泡LED單燈7w"); productNames.add("飛利浦led小球泡e14螺口4.5w透明款led節能燈泡照明光源lamp單燈"); productNames.add("飛利浦蒲公英護眼檯燈工做學習閱讀節能燈具30508帶光源"); productNames.add("歐普照明led燈泡蠟燭節能燈泡e14螺口球泡燈超亮照明單燈光源"); productNames.add("歐普照明led燈泡節能燈泡超亮光源e14e27螺旋螺口小球泡暖黃家用"); productNames.add("聚歐普照明led燈泡節能燈泡e27螺口球泡家用led照明單燈超亮光源"); Directory index = new RAMDirectory(); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter writer = new IndexWriter(index, config); for (String name : productNames) { Document doc = new Document(); doc.add(new TextField("name", name, Field.Store.YES)); writer.addDocument(doc); } writer.close(); // 3. 查詢器 String keyword = "護眼帶光源"; Query query = new QueryParser("name", analyzer).parse(keyword); // 4. 搜索 IndexReader reader = DirectoryReader.open(index); IndexSearcher searcher = new IndexSearcher(reader); int numberPerPage = 1000; System.out.printf("當前一共有%d條數據%n",productNames.size()); System.out.printf("查詢關鍵字是:\"%s\"%n",keyword); System.out.printf("查詢字符串分詞結果:\"%s\"%n",query); ScoreDoc[] hits = searcher.search(query, numberPerPage).scoreDocs; // 5. 顯示查詢結果 for (int i = 0; i < hits.length; ++i) { ScoreDoc scoreDoc= hits[i]; int docId = scoreDoc.doc; Document d = searcher.doc(docId); List<IndexableField> fields = d.getFields(); System.out.print((i + 1)); System.out.print("\t" + scoreDoc.score); for (IndexableField f : fields) { System.out.print("\t" + d.get(f.name())); } System.out.println(); } // 6. 關閉查詢 reader.close();
執行結果 1:
查詢關鍵字是:"護眼帶光源" 查詢字符串分詞結果:"name:護眼 name:帶 name:光源" 1 5.159822 飛利浦蒲公英護眼檯燈工做學習閱讀節能燈具30508帶光源 2 0.43331528 歐普照明led燈泡蠟燭節能燈泡e14螺口球泡燈超亮照明單燈光源 3 0.425806 飛利浦led燈泡e14螺口蠟燭燈泡3W尖泡拉尾節能燈泡暖黃光源Lamp 4 0.425806 飛利浦led小球泡e14螺口4.5w透明款led節能燈泡照明光源lamp單燈 5 0.425806 歐普照明led燈泡節能燈泡超亮光源e14e27螺旋螺口小球泡暖黃家用 6 0.425806 聚歐普照明led燈泡節能燈泡e27螺口球泡家用led照明單燈超亮光源
執行結果 2:
查詢關鍵字是:"led 黃色" 查詢字符串分詞結果:"name:led name:黃色" 1 0.22168216 飛利浦led小球泡e14螺口4.5w透明款led節能燈泡照明光源lamp單燈 2 0.22168216 聚歐普照明led燈泡節能燈泡e27螺口球泡家用led照明單燈超亮光源 3 0.21906272 雷士照明 LED燈泡 e27大螺口節能燈3W球泡燈 Lamp led節能燈泡 4 0.20684227 飛利浦 led燈泡 e27螺口家用3w暖白球泡燈節能燈5W燈泡LED單燈7w 5 0.1634743 飛利浦led燈泡e27螺口暖白球泡燈家用照明超亮節能燈泡轉色溫燈泡 6 0.1634743 歐普照明led燈泡蠟燭節能燈泡e14螺口球泡燈超亮照明單燈光源 7 0.16064131 飛利浦led燈泡e14螺口蠟燭燈泡3W尖泡拉尾節能燈泡暖黃光源Lamp 8 0.16064131 歐普照明led燈泡節能燈泡超亮光源e14e27螺旋螺口小球泡暖黃家用
執行結果 3:
查詢關鍵字是:"led 黃" 查詢字符串分詞結果:"name:led name:黃" 1 2.0358434 歐普照明led燈泡節能燈泡超亮光源e14e27螺旋螺口小球泡暖黃家用 2 0.22168216 飛利浦led小球泡e14螺口4.5w透明款led節能燈泡照明光源lamp單燈 3 0.22168216 聚歐普照明led燈泡節能燈泡e27螺口球泡家用led照明單燈超亮光源 4 0.21906272 雷士照明 LED燈泡 e27大螺口節能燈3W球泡燈 Lamp led節能燈泡 5 0.20684227 飛利浦 led燈泡 e27螺口家用3w暖白球泡燈節能燈5W燈泡LED單燈7w 6 0.1634743 飛利浦led燈泡e27螺口暖白球泡燈家用照明超亮節能燈泡轉色溫燈泡 7 0.1634743 歐普照明led燈泡蠟燭節能燈泡e14螺口球泡燈超亮照明單燈光源 8 0.16064131 飛利浦led燈泡e14螺口蠟燭燈泡3W尖泡拉尾節能燈泡暖黃光源Lamp
仔細查看執行結果 2 和 3,這兩次搜索意圖其實很相近,但 Lucene 卻返回了徹底不一樣的結果。實際的搜索引擎會考慮用戶的搜索意圖,例如自動修改用戶查詢字符串以得到語義(意圖)類似的查詢字符串而後進行查詢,最後向用戶展現綜合後的查詢結果
Lucene 和其餘基於 Lucene 的搜索工具默認不包含中文分詞其,默認環境下這些工具會將中文語句、段落或者文章分解爲一個個單字,沒法實現中文詞語檢索。IKAnalyzer 是一個三方中文分詞器
以 「研究生命科學」 爲例,使用默認的 Lucene 分詞器,分詞結果爲 6 個獨立的漢字:
研 | 究 | 生 | 命 | 科 | 學
使用 IKAnalyzer 做爲分詞器,分詞結果爲 5 個漢語單詞:
研究生 | 研究 | 生命科學 | 生命 | 科學
Solr (['səulə]
)是一個開源搜索平臺,用於構建搜索應用程序。它創建在 Lucene 之上
Solr 提供了相似 RESTful-API 的方式以便於其餘系統與 Solr 進行通訊,同時 Solr 提供了 web Admin 界面,便於用戶操做與管理
Core
若是說 Solr 至關於一個數據庫的話,那麼 Core 就至關於一張表
Field,查詢時須要指定字段名
Core 至關於表,接下來就要爲這個表設置字段,用於存放數據。使用 Solr 進行查詢時須要指明查找的字段與查詢的詞,例如:
SolrUtil.query("name:小米 電視 平板",0,10)
、SolrUtil.query("category:家電",0,10)
和 Solr 同樣, ElasticSearch 基於 Lucene,提供了更爲便利的訪問和調用
ES 和 Solr 同樣沒有默認的中文分詞器,須要三方工具,安裝命令:
elasticsearch-plugin.bat install file:.\elasticsearch-analysis-ik-6.2.2.zip
Kibana 是一個開源的分析和可視化平臺,設計用於和 Elasticsearch 一塊兒工做。Kibana 是分析 ES 中數據的工具,Kibana 提供了 Dev tools 工具,便於用戶使用 RESTful 風格方式向 ES 服務發送請求
默認訪問端口:127.0.0.1:5601
索引至關於就是一個數據庫服務器上的某個數據庫,因此索引也能夠當作是 Elastic Search 裏的某個數據庫
PUT /how2java?pretty GET /_cat/indices?v DELETE /how2java?pretty PUT /how2java/product/1?pretty { "name": "蠟燭" }