之前幾段工作經(jīng)歷都與搜索有關(guān),現(xiàn)在也有業(yè)務(wù)在用搜索,對搜索引擎做一個原理性的分享,包括搜索的一系列核心數(shù)據(jù)結(jié)構(gòu)和算法,盡量覆蓋搜索引擎的核心原理,但不涉及數(shù)據(jù)挖掘、NLP等 。文章有點長,多多指點~~
一、搜索引擎引題搜索引擎是什么?
這里有個概念需要提一下 。信息檢索 (Information Retrieval 簡稱 IR) 和 搜索 (Search) 是有區(qū)別的,信息檢索是一門學(xué)科,研究信息的獲取、表示、存儲、組織和訪問,而搜索只是信息檢索的一個分支,其他的如問答系統(tǒng)、信息抽取、信息過濾也可以是信息檢索 。
本文要講的搜索引擎,是通常意義上的全文搜索引擎、垂直搜索引擎的普遍原理,比如 Google、Baidu,天貓搜索商品、口碑搜索美食、飛豬搜索酒店等 。
Lucene 是非常出名且高效的全文檢索工具包,ES 和 Solr 底層都是使用的 Lucene,本文的大部分原理和算法都會以 Lucene 來舉例介紹 。
為什么需要搜索引擎?看一個實際的例子:如何從一個億級數(shù)據(jù)的商品表里,尋找名字含“秋褲”的 商品 。
使用SQL Like
select * from item where name like '%秋褲%'如上,大家第一能想到的實現(xiàn)是用 like,但這無法使用上索引,會在大量數(shù)據(jù)集上做一次遍歷操作,查詢會非常的慢 。有沒有更簡單的方法呢,可能會說能不能加個秋褲的分類或者標簽,很好,那如果新增一個商品品類怎么辦呢?要加無數(shù)個分類和標簽嗎?如何能更簡單高效的處理全文檢索呢?
使用搜索引擎

答案是搜索,會事先 build 一個倒排索引,通過詞法語法分析、分詞、構(gòu)建詞典、構(gòu)建倒排表、壓縮優(yōu)化等操作構(gòu)建一個索引,查詢時通過詞典能快速拿到結(jié)果 。這既能解決全文檢索的問題,又能解決了SQL查詢速度慢的問題 。
那么,淘寶是如何在1毫秒從上億個商品找到上千種秋褲的呢,谷歌如何在1毫秒從萬億個網(wǎng)頁中找尋到與你關(guān)鍵字匹配的幾十萬個網(wǎng)頁,如此大的數(shù)據(jù)量是怎么做到毫秒返回的 。
二、搜索引擎是怎么做的?Part1. 分詞
分詞就是對一段文本,通過規(guī)則或者算法分出多個詞,每個詞作為搜索的最細粒度一個個單字或者單詞 。只有分詞后有這個詞,搜索才能搜到,分詞的正確性非常重要 。分詞粒度太大,搜索召回率就會偏低,分詞粒度太小,準確率就會降低 。如何恰到好處的分詞,是搜索引擎需要做的第一步 。
正確性&粒度
- 分詞正確性
- “他說的確實在理”,這句話如何分詞?
- “他-說-的確-實在-理” [錯誤語義]
- “他-說-的-確實-在理” [正確語義]
- 分詞的粒度
- “中華人民共和國憲法”,這句話如何分詞?
- “中華人民共和國-憲法”,[搜索 中華、共和國 無結(jié)果]
- “中華-人民-共和國-憲法”,[搜索 共和 無結(jié)果]
- “中-華-人-民-共-和-國-憲-法”,[搜索其中任意字都有結(jié)果]
如何準確的把控分詞,涉及到 NLP 的內(nèi)容啦,這里就不展開了 。
停用詞
很多語句中的詞都是沒有意義的,比如 “的”,“在” 等副詞、謂詞,英文中的 “a”,“an”,“the”,在搜索是無任何意義的,所以在分詞構(gòu)建索引時都會去除,降低不不要的索引空間,叫停用詞 (StopWord) 。
推薦閱讀
- 網(wǎng)絡(luò)電話的原理是什么
- 網(wǎng)絡(luò)爬蟲的原理
- 網(wǎng)橋的工作原理
- 網(wǎng)絡(luò)傳輸?shù)脑?
- 太陽能熱水器工作原理 太陽能熱水器的基本參數(shù)
- 軟件無線電原理與應(yīng)用 5g網(wǎng)絡(luò)架構(gòu)及關(guān)鍵技術(shù)分析
- 入射面和折射面的定義及其物理原理 入射面和折射面的定義是什么
- 機械原理關(guān)于斜齒輪重合度的問題
- 機械千斤頂?shù)脑砑?
- 機械制冷的原理
