搜索引擎
為什么需要搜索引擎?
1.對于海量數(shù)據(jù)的搜索傅联,SQL語句查詢幾乎 不能達到要求秸苗,因為在海量數(shù)據(jù)中這種查詢響應時間 遠遠超過用戶能夠接受的等待時間。
2.不能很好的命中索引:對于like這類模糊查詢爹土,只有后模糊匹配語句才能命中索引甥雕,一旦沒有命中索引則會掃描全表 性能低下
搜索引擎的通用算法和結(jié)構(gòu)
- 搜索引擎分類
- 全文搜索引擎 對網(wǎng)頁的文字、圖片胀茵、視頻和鏈接等內(nèi)容進行搜索社露。
- 垂直搜索引擎 對網(wǎng)站垂直領(lǐng)域進行收集和處理,如在商旅網(wǎng)站中對機票琼娘、旅游信息等進行搜索的搜索引擎
- 元數(shù)據(jù)搜索引擎 對數(shù)據(jù)的數(shù)據(jù)進行搜索和處理峭弟,如文章中有多少字數(shù)附鸽,文件的大小等,可將其看做是多種搜索引擎的數(shù)據(jù)進行整合后再提供給用戶的搜索引擎
- 必須知道的倒排索引
- 正排索引 正排索引是以文檔ID為關(guān)鍵字瞒瘸,正排表中記錄文檔中每個關(guān)鍵字問題的位置信息坷备,查詢需要便利每一個文檔。正排索引是按照key去尋找具體的value情臭。
- 倒排索引 倒排索引是指依據(jù)關(guān)鍵詞查找文檔省撑,用關(guān)鍵詞作為索引的key,每個關(guān)鍵詞的倒排索引都的值都是一個列表。倒排索引其實就是 先將記錄中的某些列進行分詞俯在,然后形成分詞 與文檔ID的映射關(guān)系竟秫。
互聯(lián)網(wǎng)搜索引擎的技術(shù)架構(gòu)
- 發(fā)生在用戶搜索前
- 使用爬蟲技術(shù)抓取網(wǎng)絡中的網(wǎng)頁并且下載到本地
- 用去重模塊對下載的網(wǎng)頁進行去重,確保每個網(wǎng)頁都包含獨一無二的內(nèi)容
- 用解析模塊去對去重后的網(wǎng)頁進行解析跷乐,用算法對抓取的網(wǎng)頁解析肥败,構(gòu)建倒排索引表,并進行相關(guān)的操作愕提。最終搭建出一個鏈接關(guān)系
- 對已經(jīng)完成的倒排索引表及鏈接關(guān)系等進行反作弊處理馒稍,例如剔除掉一些敏感信息。
- 發(fā)生在用戶搜索過程中
- 搜索引擎接受用戶搜索的關(guān)鍵詞 進行查詢分析
- 搜索引擎在緩存系統(tǒng)中搜索是否有與用戶搜索關(guān)聯(lián)詞匹配的內(nèi)容
- 如果有 則直接返回給用戶
- 如果沒有浅侨,則利用內(nèi)容相似性纽谒、鏈接分析算法對網(wǎng)頁進行排序,把用戶想要的內(nèi)容放在展示列表的前面仗颈,并把列表放入緩存系統(tǒng)中
Lucene 與Elasticsearch的前世今生
Lucene是早期出現(xiàn)的一些開源搜索引擎當中最受歡迎的佛舱,但是隨著業(yè)務發(fā)展Lucene無法滿足業(yè)務實現(xiàn)。所以基于Lucene構(gòu)建了一套功能強大的搜索平臺Elasticsearch挨决。
Elasticsearch相比Lucence具備如下優(yōu)勢
- 接近實時
- 從索引一個文檔到這個文檔能夠被搜索到只有很小的延時
- 基于Elasticsearch執(zhí)行搜索和分析可以達到秒級
- 集群
- 利用Elasticsearch可以很方便地搭建集群请祖。在Elasticsearch集群中有很多節(jié)點,其中一個是主節(jié)點脖祈,主節(jié)點是通過枚舉產(chǎn)生地肆捕。
- 節(jié)點
- client_node 做請求分發(fā)
- master_node 主節(jié)點 所有的新增、刪除及數(shù)據(jù)分片都是由主節(jié)點來操作的盖高,它也提供搜索請求功能
- data_node 只能進行搜索操作慎陵,具體Elasticsearch分配哪個data_node來進行操作是由client_node決定的
- 文檔
- 文檔是由Elasticsearch的最小數(shù)據(jù)單元,一個文檔可以是一條商品數(shù)據(jù)喻奥,也可也是一個訂單數(shù)據(jù)通常是JSON格式
- 索引
- 索引主要用來存儲Elasticsearch的數(shù)據(jù)席纽,索引包含一堆相似的文檔數(shù)據(jù),例如商品數(shù)據(jù)撞蚕,一個索引包含很多文檔润梯。
- 文檔類型
- 文檔類型用來規(guī)定文檔中字段內(nèi)容的數(shù)據(jù)類型和其他的一些約束,相當于關(guān)系型數(shù)據(jù)庫中的表
- 分片
- 單臺機器無法存儲大量數(shù)據(jù),Elasticsearch可以將一個索引中的數(shù)據(jù)切分為多個分片纺铭,這些分片分布在多臺服務器上寇钉。有了分片就可以橫向擴展,存儲更多數(shù)據(jù)舶赔,讓索引和分析等操作分不到多臺服務器上去執(zhí)行扫倡,從而提升吞吐量和性能。
- 副本
- 任何一個服務器隨時可能出現(xiàn)故障或者宕機竟纳,此時分片可能會丟失撵溃。因此,可以分為每個分片創(chuàng)建多個副本锥累。副本可以在分片出現(xiàn)故障時提供備用服務征懈。
Elasticsearch分布式架構(gòu)原理
- 添加索引 Elasticsearch中索引與分片的關(guān)系
- 分片是最小級別的工作單元,它只保存了索引中所有數(shù)據(jù)的一部分
- 所有的文檔均存放在分片中揩悄,而直接與應用程序進行交互的是索引。
- 如何保證高可用鬼悠?
- 當Node節(jié)點宕機删性,會進行重新選舉。
- 如何擴展焕窝?
- Elasticsearch要求在創(chuàng)建索引時就指定分片數(shù)量蹬挺,所以主分片在之后后就不能再進行擴充了。
Elasticsearch大數(shù)據(jù)量 提高Elascicsearch查詢效率
- 性能力利器FileSystem cache
在查詢數(shù)據(jù)時它掂,Elasticsearch主要依賴于底層的FileSystem Cache巴帮,即先通過任意一個分片Shard在FileSystem cache中查找數(shù)據(jù),入股哦查到直接返回虐秋;否則查詢磁盤文件并且將數(shù)據(jù)緩存到FileSystem cache中
假如有3臺服務器榕茧,內(nèi)存都是32GB Elasticsearch的JVM heap被設置為16GB 留給FileSystem Cache的還有16GB
此時3臺服務器能夠被緩存的數(shù)據(jù)量=3*16GB=48GB 所以只有這48GB的數(shù)據(jù)的查詢速度會很快。
- 數(shù)據(jù)預熱
- 如果Elasticsearch集群中每個機器寫入的數(shù)據(jù)都超過FileSystem cache的容量很多客给, 比如寫入70G FileSytem只有30G 那么還有40G就被寫入磁盤當中了可以使用數(shù)據(jù)預熱的方案來解決該問題用押。
- 將被頻繁的熱點數(shù)據(jù)提前放進Elasticsearch索引中,或者用一個熱點數(shù)據(jù)檢測系統(tǒng)定時或者實時地找出熱點數(shù)據(jù)
- 將發(fā)現(xiàn)的熱點數(shù)據(jù)提前放進FileSystem Cache靶剑。這樣用戶正常訪問性能會很高蜻拨。
- 冷熱分離
- 可以將大量很少被訪問的數(shù)據(jù)放進一個單獨的Elasticsearch索引中,將熱點數(shù)據(jù)放進另外一個數(shù)據(jù)當中桩引。
- 索引文檔設計
- 在Elastcisearch中不建議使用復雜的關(guān)聯(lián)查詢 因為它會降低性能缎讼,所以如果有復雜的查詢建議在程序當中完成
- 分頁性能優(yōu)化
- 避免使用深度分頁
- 使用游標查詢
- 使用search_after搜索