重温Elasticsearch
什么是 Elasticsearch ?
Elasticsearch (ES) 是一個基于 Lucene 構建的開源、分布式、RESTful 接口全文搜索引擎。還是一個分布式文檔數據庫,其中每個字段均是被索引的數據且可被搜索,它能夠擴展至數以百計的服務器存儲以及處理PB級的數據。它可以在很短的時間內在儲、搜索和分析大量的數據。它通常作為具有復雜搜索場景情況下的核心發動機。
官網:https://www.elastic.co/downloads/elasticsearch
中文社區:https://es.xiaoleilu.com/
什么是PB級別:https://baike.baidu.com/item/PetaByte/5910820
為什么要用 Elasticsearch ?
1、提高搜索效率
如果使用數據庫進行模糊查詢,比如 like 語句,他會遍歷整張表,同時進行字符串匹配,如果數據庫數據量非常龐大的話,會非常消耗資源和時間。
在換用 Elasticsearch 后,TB級別數據也能在毫秒級就能返回檢索結果。
原因:Elasticsearch是基于倒排索引的
2、自動分詞
在使用數據庫的前提下,組合詞檢索是非常困難的,比如,當用戶在搜索框輸入"四川火鍋”時,數據庫通常只能把這四個字去進行全部匹配??墒窃谖谋局?#xff0c;可能會出現“推薦四川好吃的火鍋”,這時候就沒有結果了。
原因:數據庫并不支持分詞。如果人工去開發分詞功能,費時費精力。
如果換用 Elasticsearch,使用云搜索服務后,就不用太過于關注分詞了,因為 Elasticsearch 支持中文分詞插件,很好地解決了問題。當用戶使用Elasticsearch時進行搜索時,Elasticsearch 就自動幫他分好詞了。
例如當輸入“四川火鍋”時,Elasticsearch會自動做下面兩件事 :
3. 相關性
在用數據庫做搜索時,結果經常會出現一系列文檔。但是數據庫并不支持相關性搜索。
例如,當用戶搜索“咖啡廳”的時候,他很可能更想知道附近哪里可以喝咖啡,而不是怎么開咖啡廳。
- 到底什么文檔是用戶真正想要的呢?
- 怎么才能把用戶想看的文檔放在搜索列表最前面呢?
當使用了云搜索服務后,發現 Elasticsearch 能很好地支持相關性評分。通過合理的優化,云搜索服務能夠返回精準的結果,滿足用戶的需求。
原因: Elasticsearch 支持全文搜索和相關度評分。這樣在返回結果就會根據分數由高到低排列。分數越高,意味著和查詢語句越相關。
所以,當用戶搜索“星巴克咖啡”,帶有“星巴克咖啡”的信息就要比只包含“咖啡”的信息靠前。
4、海量存儲
Elasticsearch 是為高可用和可擴展而生的??梢酝ㄟ^購置性能更強的服務器來完成。
橫向可擴展性:只需要增加臺服務器,做一點兒配置,啟動一下 Elasticsearch 就可以并入集群。
分片機制提供更好的分布性:同一個索引分成多個分片(sharding), 這點類似于HDFS的塊機制;分而治之的方式可提升處理效率。
高可用:提供復制( replica) 機制,一個分片可以設置多個復制,使得某臺服務器在宕機的情況下,集群仍舊可以照常運行,并會把服務器宕機丟失的數據信息復制恢復到其他可用節點上。
5、可視化界面
在使用數據庫進行查詢數據時,很多時候都是通過工程代碼或者命令端完成。其實在分析結果時并不太方便,缺少一個可視化界面來提高效率。
原因: 數據庫自身通常不帶可視化界面。而在完成搜索相關的任務時,常常需要根據搜索結果來進行分析。
而 Kibana 可視化工具則完美支持 Elasticsearch。研發人員能夠在上面快速地進行概念驗證,分析結果,提高開發效率。
Elasticsearch基本概念
Elasticsearch是面向文檔型數據庫的,一條數據即一個文檔,用 JSON 作為文檔序列化的格式,比如下面這條用戶數據:
{????"name"?:?????"John",
????"sex"?:??????"Male",
????"age"?:??????25,
????"birthDate":?"1990/05/01",
????"about"?:????"I?love?to?go?rock?climbing",
????"interests":?[?"sports",?"music"?]
}
關于Elasticsearch以及Kibana的安裝請參考之前的一篇文章:<了解一下Elasticsearch的基本概念>
Elasticsearch是如何做到快速索引的?
首先 Elasticsearch 使用的是倒排索引,何為倒排索引?
如上圖,當用戶搜索“手機”時,Elasticsearch 就會立即返回文檔 F,G,H。這樣就不用花多余的時間在其他文檔上了,因此檢索速度得到了數量級的提升。
也許你還不太了解倒排索引,甚至是正向索引也不了解?
什么是正向索引
正向索引是文檔與關鍵詞一一對應的數據結構。
其以文檔的ID為關鍵字,表中記錄文檔中每個字的位置信息,查找時掃描表中每個文檔中字的信息直到找出所有包含查詢關鍵字的文檔。
這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易于維護;因為索引是基于文檔建立的,若是有新的文檔加入,直接為該文檔建立一個新的索引塊,掛接在原來索引文件的后面。若是有文檔刪除,則直接找到該文檔號文檔對應的索引信息,將其直接刪除。但是在查詢的時候需對所有的文檔進行掃描以確保沒有遺漏,這樣就使得檢索時間大大延長,檢索效率低下。
盡管正向索引的工作原理非常的簡單,但是由于其檢索效率太低,除非在特定情況下,否則實用性價值不大。
為了進一步理解,在這舉個例子:
我們假設有網頁1和網頁2:
網頁1中僅包含一句話:廈門SEO顧問瀟湘馭文為您提供廈門SEO培訓服務。
網頁2中也僅包含一句話:SEO是一門藝術。
經過搜索引擎初步分詞之后,網頁1和2的正向索引如下圖所示:
假設使用正向索引,那么當你搜索SEO的時候,搜索引擎必須檢索網頁中的每一個關鍵詞,假設一個網頁中包含成千上百個關鍵詞,可想而知,會造成大量的資源浪費。于是倒排索引應運而生。
什么是倒排索引
正向索引是關鍵詞與文檔一一對應的數據結構。
其以字或詞為關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的所有文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置情況。
由于每個字或詞對應的文檔數量在動態變化,所以倒排表的建立和維護都較為復雜,但是在查詢的時候由于可以一次得到查詢關鍵字所對應的所有文檔,所以效率高于正排表。
在全文檢索中,檢索的快速響應是一個最為關鍵的性能,而索引建立由于在后臺進行,盡管效率相對低一些,但不會影響整個搜索引擎的效率。
概括:正排索引是從文檔到關鍵字的映射(已知文檔求關鍵字),倒排索引是從關鍵字到文檔的映射(已知關鍵字求文檔)。
我們再來看一下上邊的例子用倒排索引是什么樣的。
從上圖可以一目了然,倒排索引可以直接參與排名。
比如你搜索“SEO”,搜索引擎可以快速檢索出包含“SEO”搜索詞的網頁1和網頁2,為后續的相關度和權重計算奠定基礎,從而大大加快了返回搜索結果的速度。
再看一個例子:
倒排索引會對以上文檔內容進行關鍵詞分詞,可以使用關鍵詞直接定位到文檔內容。
當你搜索[科技公司]后,會立即返回序號id為[1,2,4,5]的文檔,而不是去進行全文關鍵字匹配。
DSL語言查詢與過濾
什么是DSL語言?
ES 中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
由于DSL查詢更為直觀也更為簡易,所以大都使用這種方式。
DSL查詢是POST過去一個JSON,由于POST的請求是JSON格式的,所以存在很多靈活性,也有很多形式。
舉個例子,詳細的可自行查詢了解:
根據名稱精準查詢姓名:
GET?ttyy/user/_search{
??"query":?{
????"term":?{
??????"name":?"奶茶"
????}
??}
}
其中 term 是代表完全匹配,即不進行分詞器分析,文檔中必須包含整個搜索的詞匯;類似的還有 Match;
分詞器
什么是分詞器
因為 Elasticsearch 中默認的標準分詞器分詞器對中文分詞不是很友好,會將中文詞語拆分成一個一個中文的漢字,因此引入中文分詞器 ik 插件。
演示傳統分詞器
{??"analyzer":?"standard",
??"text":?"奧迪a4l"
}
{
????"tokens":?[
????????{
????????????"token":?"奧",
????????????"start_offset":?0,
????????????"end_offset":?1,
????????????"type":?"<IDEOGRAPHIC>",
????????????"position":?0
????????},
????????{
????????????"token":?"迪",
????????????"start_offset":?1,
????????????"end_offset":?2,
????????????"type":?"<IDEOGRAPHIC>",
????????????"position":?1
????????},
????????{
????????????"token":?"a4l",
????????????"start_offset":?2,
????????????"end_offset":?5,
????????????"type":?"<ALPHANUM>",
????????????"position":?2
????????}
????]
}
采用 ik 分詞器后:
{??"analyzer":?"ik_smart",
??"text":?"奧迪"
}
{
????"tokens":?[
????????{
????????????"token":?"奧迪",
????????????"start_offset":?0,
????????????"end_offset":?2,
????????????"type":?"CN_WORD",
????????????"position":?0
????????},
????????{
????????????"token":?"a4l",
????????????"start_offset":?2,
????????????"end_offset":?5,
????????????"type":?"LETTER",
????????????"position":?1
????????}
????]
}
ES集群環境搭建
ES為什么要實現集群
在搭建集群之前先了解一下es為什么要實現集群。
ES集群中索引可能由多個分片構成,并且每個分片可以擁有多個副本。通過將一個單獨的索引分為多個分片,我們可以處理不能在一個單一的服務器上面運行的大型索引,簡單的說就是索引的大小過大,導致效率問題。不能運行的原因可能是內存也可能是存儲。
由于每個分片可以有多個副本,通過將副本分配到多個服務器,可以提高查詢的負載能力。
簡而言之就是提高查詢的負載能力。
ES集群核心原理分析:
數據存儲。
1、每個索引會被分成多個分片shards進行存儲,默認創建索引是分配5個分片進行存儲。
每個分片都會分布式部署在多個不同的節點上進行部署,該分片成為primary shards。
注意:索引的主分片primary shards定義好后,后面不能做修改。
2、為了實現高可用數據的高可用,主分片可以有對應的備分片replics shards,replic shards分片承載了負責容錯、以及請求的負載均衡。
**注意: **每一個主分片為了實現高可用,都會有自己對應的備分片,主分片對應的備分片不能存放同一臺服務器上。,主分片primary shards可以和其他replics shards存放在同一個node節點上。
補充1:單臺ES服務器中是沒有備份分片的
補充2:主分片對應的備份分片不能存放在同一臺服務器上。
如下圖所示:
Node表示服務器,P表示主分片,R表示備份分片
服務器環境
準備三臺服務器
| node-1 | 192.168.212.182 |
| node-2 | 192.168.212.183 |
| node-3 | 192.168.212.184 |
服務集群配置
vi?elasticsearch.ymlcluster.name:?myes??###保證三臺服務器節點集群名稱相同
node.name:?node-1?####?每個節點名稱不一樣?其他兩臺為?node-1?,node-2
network.host:?192.168.212.180?####?實際服務器ip地址
discovery.zen.ping.unicast.hosts:?["192.168.212.184",?"192.168.212.185","192.168.212.186"]##多個服務集群ip
discovery.zen.minimum_master_nodes:?1
關閉防火墻 systemctl stop firewalld.service
默認底層開啟9300 集群
驗證集群效果:
http://192.168.212.185:9200/_cat/nodes?pretty參考文章:
https://blog.csdn.net/weixin_39819880/article/details/82083034
https://www.cnblogs.com/dreamroute/p/8484457.html
我創建了一個java相關的公眾號,用來記錄自己的學習之路,感興趣的小伙伴可以關注一下微信公眾號哈:niceyoo
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的重温Elasticsearch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wps计算机打印双面输出,如何在电脑wp
- 下一篇: IOS https抓包及10.3.3版本