1、什么是搜索:百度着降、垂直搜索(站內(nèi)搜索)
搜索:通過一個(gè)關(guān)鍵詞或一段描述差油,得到你想要的(相關(guān)度高)結(jié)果。
2任洞、如何通過Mysql實(shí)現(xiàn)搜索功能?
如果我們使用Mysql等關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)搜索功能蓄喇,我們需要對(duì)搜索的字段進(jìn)行模糊查詢,比如 where name like '%王%'交掏,這樣的模糊查詢導(dǎo)致索引失效妆偏,需要進(jìn)行全表查詢,時(shí)間復(fù)雜度是O(N)盅弛。
另外Mysql不支持分詞钱骂,所以搜索的結(jié)果必須完全包含搜索字段叔锐。
所以使用關(guān)系型數(shù)據(jù)庫:性能差、不可靠见秽、結(jié)果不準(zhǔn)確(相關(guān)度低)
3愉烙、倒排索引
舉例說明:
我們有若干數(shù)據(jù),如圖所示:
建立倒排索引:(簡(jiǎn)單的舉例)
- 根據(jù)brandName進(jìn)行分詞解取,得到小米步责、手機(jī)、NFC等
- 記錄分詞在brandName中出現(xiàn)的id
-
比如搜索小米NFC手機(jī)肮蛹,會(huì)找到對(duì)應(yīng)匹配的詞項(xiàng)勺择,從而找到有匹配度的內(nèi)容
倒排索引的數(shù)據(jù)結(jié)構(gòu)
1、包含這個(gè)關(guān)鍵詞的document list ——可以簡(jiǎn)單理解為這個(gè)關(guān)鍵字在哪些數(shù)據(jù)中出現(xiàn)過伦忠,比如小米在ID為1,2,4的文檔中出現(xiàn)過省核,則包含小米的document list為1,2昆码,4
2气忠、關(guān)鍵詞在每個(gè)doc中出現(xiàn)的次數(shù) TF term frequency——TF越高則相關(guān)度越高
3、關(guān)鍵詞在整個(gè)索引中出現(xiàn)的次數(shù) IDF inverse doc ——IDF越高則相關(guān)度越低赋咽,可以理解為如果每一個(gè)document都有某個(gè)關(guān)鍵詞旧噪,則用這個(gè)關(guān)鍵詞評(píng)判相關(guān)度是沒有意義的
4、關(guān)鍵詞在當(dāng)前doc中出現(xiàn)的次數(shù)
5脓匿、每個(gè)doc的長(zhǎng)度淘钟,越長(zhǎng)相關(guān)度越低
6、包含這個(gè)關(guān)鍵詞的所有doc的平均長(zhǎng)度
4陪毡、Lucene
本質(zhì)是jar包米母,幫我們創(chuàng)建倒排索引,提供了復(fù)雜的API
如果用Lucene做集群實(shí)現(xiàn)搜索毡琉,會(huì)有那些問題:
① 節(jié)點(diǎn)一旦宕機(jī)铁瞒,節(jié)點(diǎn)數(shù)據(jù)丟失,后果不堪設(shè)想桅滋,可用性差慧耍。
② 自己維護(hù),自己創(chuàng)建管理索引丐谋,單臺(tái)節(jié)點(diǎn)(Lucene是單點(diǎn)的)的承載請(qǐng)求的能力是有限的芍碧,需要人工做負(fù)載。
5号俐、Elasticsearch:分布式师枣、高性能、高可用萧落、可伸縮践美、易維護(hù) ES≠搜索引擎
(1) 分布式的搜索,存儲(chǔ)和數(shù)據(jù)分析引擎
(2) 優(yōu)點(diǎn):
① 面向開發(fā)者友好找岖,屏蔽了Lucene的復(fù)雜特性陨倡,集群自動(dòng)發(fā)現(xiàn)(cluster discovery)
cluster discovery:在集群內(nèi)啟動(dòng)了新的服務(wù),集群會(huì)自動(dòng)發(fā)現(xiàn)這個(gè)服務(wù)并把該服務(wù)加入進(jìn)來
② 自動(dòng)維護(hù)數(shù)據(jù)在多個(gè)節(jié)點(diǎn)上的建立
③ 搜索請(qǐng)求的負(fù)載均衡
④ 自動(dòng)維護(hù)冗余副本许布,保證了部分節(jié)點(diǎn)宕機(jī)的情況下仍然不會(huì)有任何數(shù)據(jù)丟失
⑤ ES基于Lucene提供了很多高級(jí)功能:復(fù)合查詢兴革、聚合分析、基于地理位置等蜜唾。
⑥ 對(duì)于大公司杂曲,可以構(gòu)建幾百臺(tái)服務(wù)器的大型分布式集群,處理PB級(jí)別數(shù)據(jù)袁余;對(duì)于小公司擎勘,開箱即用,門檻低上手簡(jiǎn)單颖榜。
⑦ 相遇傳統(tǒng)數(shù)據(jù)庫棚饵,提供了全文檢索,同義詞處理(美麗的>漂亮的)掩完,相關(guān)度排名噪漾。聚合分析以及海量數(shù)據(jù)的近實(shí)時(shí)(NTR)處理,這些傳統(tǒng)數(shù)據(jù)庫完全做不到且蓬。
(3) 應(yīng)用領(lǐng)域:
① 百度(全文檢索欣硼、高亮、搜索推薦)
② 各大網(wǎng)站的用戶行為日志(用戶點(diǎn)擊恶阴、瀏覽诈胜、收藏、評(píng)論)
③ BI(Business Intelligence商業(yè)智能)存淫,數(shù)據(jù)分析:數(shù)據(jù)挖掘統(tǒng)計(jì)耘斩。
④ Github:代碼托管平臺(tái),幾千億行代碼
⑤ ELK:Elasticsearch(數(shù)據(jù)存儲(chǔ))桅咆、Logstash(日志采集)括授、Kibana(可視化)
6、ES核心概念:
(1) cluster(集群):每個(gè)集群至少包含兩個(gè)節(jié)點(diǎn).
(2) node:集群中的每個(gè)節(jié)點(diǎn)岩饼,一個(gè)節(jié)點(diǎn)不代表一臺(tái)服務(wù)器
(3) field:一個(gè)數(shù)據(jù)字段荚虚,與index和type一起,可以定位一個(gè)doc
(4) document:ES最小的數(shù)據(jù)單元 Json
(5)Type:邏輯上的數(shù)據(jù)分類籍茧,es 7.x中刪除了type的概念
(6)Index:一類相同或者類似的doc版述,比如一個(gè)員工索引,商品索引寞冯。
{
#document
"id": "1",
"name": "小米",
"price": {
"標(biāo)準(zhǔn)版": 3999,
"尊享版": 4999,
"吳磊簽名定制版": 19999
}
}
Shard分片:
1:一個(gè)index包含多個(gè)Shard渴析,默認(rèn)5P(主分片)晚伙,默認(rèn)每個(gè)P分配一個(gè)R(從分片),P的數(shù)量在創(chuàng)建索引的時(shí)候設(shè)置俭茧,如果想修改咆疗,需要重建索引。
2:每個(gè)Shard都是一個(gè)Lucene實(shí)例母债,有完整的創(chuàng)建索引的處理請(qǐng)求能力午磁。
3:ES會(huì)自動(dòng)在nodes上為我們做shard 均衡。
4:一個(gè)doc是不可能同時(shí)存在于多個(gè)PShard中的毡们,但是可以存在于多個(gè)RShard中迅皇。