ElasticSearch學習筆記(超詳細)

 

文章目錄

  • 初識ElasticSearch
    • 什麼是ElasticSearch
    • ElasticSearch特色
    • ElasticSearch用途
    • ElasticSearch底層實現
    • ElasticSearch和Solr的區別
      • Solr是什麼
      • 不一樣場景時兩個的對比
      • 總結
    • ElasticSearch體系結構
    • 倒排索引
    • 什麼是Term Dictionary
    • 什麼是Term Index
    • 爲何 Elasticsearch/Lucene 檢索能夠比 MySQL快
  • 什麼是ELK
  • 安裝ElasticSearch
    • 安裝ik分詞器
    • 測試ik分詞器
    • IK分詞器的兩種分詞模式
    • ik分詞器添加自定義詞庫
  • 安裝ElasticSearch-head
  • 安裝Kibana
  • REST風格說明
    • 什麼是REST風格
    • 基本REST命令說明
    • PUT命令
      • 建立類型
      • 插入數據
      • 更新數據
    • POST命令
      • 更新數據(推薦使用)
    • DELETE命令
    • GET命令
      • 查詢數據(重點)
        • 精確查詢
        • 查詢字符串搜索
        • 查詢全部結果
        • 條件查詢
        • 布爾查詢
        • 按排序查詢
        • 分頁查詢
        • 指定查詢結果的字段
        • 高亮查詢
      • 拓展

 

初識ElasticSearch

什麼是ElasticSearch

Elasticsearch 是一個分佈式的開源搜索和分析引擎,適用於全部類型的數據,包括文本、數字、地理空間、結構化和非結構化數據。它能夠幫助你用史無前例的速度去處理大規模數據。ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。html

ElasticSearch特色

  • 能夠做爲一個大型分佈式集羣(數百臺服務器)技術,處理PB級數據,服務大公司;也能夠運行在單機上,服務小公司
  • 對用戶而言,是開箱即用的,很是簡單,做爲中小型的應用,直接3分鐘部署一下ES
  • Elasticsearch做爲傳統數據庫的一個補充,好比全文檢索,同義詞處理,相關度排名,複雜數據分析,海量數據的近實時處理
  • Elasticsearch不是什麼新技術,主要是將全文檢索、數據分析以及分佈式技術,合併在了一塊兒,才造成了獨一無二的ES;lucene(全文檢索),商用的數據分析軟件(也是有的),分佈式數據庫(mycat)

ElasticSearch用途

Elasticsearch 在速度和可擴展性方面都表現出色,並且還可以索引多種類型的內容,這意味着其可用於多種用例:node

  • 應用程序搜索
  • 網站搜索
  • 企業搜索
  • 日誌處理和分析
  • 基礎設施指標和容器監測
  • 應用程序性能監測
  • 地理空間數據分析和可視化
  • 安全分析
  • 業務分析

維基百科使用Elasticsearch提供全文搜索並高亮關鍵字,以及輸入實時搜索(search-asyou-type)和搜索糾錯(did-you-mean)等搜索建議功能。git

英國衛報使用Elasticsearch結合用戶日誌和社交網絡數據提供給他們的編輯以實時的反饋,以便及時瞭解公衆對新發表的文章的迴應。github

Github使用Elasticsearch檢索1300億行的代碼。web

ElasticSearch底層實現

ElasticSearch是基於對 Lucene 進行封裝,將搜索引擎的操做封裝成了RESTful API,經過http請求就能夠調用,目的是爲了隱藏Lucene的複雜性,從而讓全文搜索變得簡單。數據庫

ElasticSearch和Solr的區別

Solr是什麼

Solr 是Apache下的一個頂級開源項目,採用Java開發,它是基於Lucene的全文搜索服務器。Solr提供了比Lucene更爲豐富的查詢語言,同時實現了可配置、可擴展,並對索引、搜索性能進行了優化。npm

Solr能夠獨立運行,運行在Jetty、Tomcat等這些Servlet容器中,Solr 索引的實現方法很簡單,用 POST 方法向 Solr 服務器發送一個描述 Field 及其內容的 XML 文檔,Solr根據xml文檔添加、刪除、更新索引 。Solr 搜索只須要發送 HTTP GET 請求,而後對 Solr 返回Xml、json等格式的查詢結果進行解析,組織頁面佈局。Solr不提供構建UI的功能,Solr提供了一個管理界面,經過管理界面能夠查詢Solr的配置和運行狀況。json

Solr是基於lucene開發企業級搜索服務器,實際上就是封裝了lucene。瀏覽器

Solr是一個獨立的企業級搜索應用服務器,它對外提供相似於Web-service的API接口。用戶能夠經過http請求,向搜索引擎服務器提交必定格式的文件,生成索引;也能夠經過提出查找請求,並獲得返回結果。緩存

不一樣場景時兩個的對比

ElasticSearch學習筆記
ElasticSearch學習筆記
ElasticSearch學習筆記
ElasticSearch學習筆記

總結

(1)es基本是開箱即用,很是簡單。Solr安裝略微複雜一點。

(2)Solr 利用 Zookeeper 進行分佈式管理,而 Elasticsearch 自身帶有分佈式協調管理功能。

(3)Solr 支持更多格式的數據,好比JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式

(4)Solr 官方提供的功能更多,而 Elasticsearch 自己更注重於核心功能,高級功能多有第三方插件提供,例如圖形化界面須要kibana支撐

(5)Solr 查詢快,但更新索引時慢(即插入刪除慢),用於電商等查詢多的應用;ES創建索引快(即查詢慢),即實時性查詢快,用於FaceBook、百度等搜索。Solr 是傳統搜索應用的有力解決方案,但 Elasticsearch 更適用於新興的實時搜索應用。

(6)Solr比較成熟,有一個更大,更成熟的用戶、開發和貢獻者社區,而 Elasticsearch相對開發維護者較少,更新太快,學習使用成本較高。

ElasticSearch體系結構

初學者建議將 ElasticSearch當爲一個數據庫進行學習。

下圖是Elasticsearch與關係型數據庫邏輯結構概念的對比:
ElasticSearch學習筆記

倒排索引

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地來說,正向索引是經過key找value反向索引則是經過value找key

正向索引:
MYSQL數據庫所用的索引就是正向索引,適合根據文檔中的ID來查詢對應的內容。可是在查詢一個keyword在哪些文檔裏包含的時候需對全部的文檔進行掃描以確保沒有遺漏,這樣就使得檢索時間大大延長,檢索效率低下。

正向索引構建的結果以下圖:
ElasticSearch學習筆記

倒排索引:
與正序索引相反。在搜索引擎中每一個文件都對應一個文件ID,文件內容被表示爲一系列關鍵詞的集合,記錄每一個關鍵字在文檔中出現的頻率和出現的位置。

按照上面的文檔內容構建的倒排索引結果會以下圖:
ElasticSearch學習筆記
ElasticSearch學習筆記
ElasticSearch學習筆記
若是咱們要經過倒排索引查找‘Male’這個關鍵詞在哪些文檔中出現過,首先咱們經過倒排索引能夠查詢到該關鍵詞出現的文檔位置是在2和3中;而後再經過正排索引查詢到文檔2和3的內容並返回結果。

什麼是Term Dictionary

Elasticsearch爲了能快速找到某個Term,將全部的Term排個序,二分法查找Term,這就是Term Dictionary。

什麼是Term Index

若是Term太多,Term Dictionary也會很大,所有放在內存不現實,只能部分存儲到磁盤上。這是又出現了新的問題,磁盤尋道次數太多也會嚴重影響查找效率,爲了減小磁盤尋道次數來提升查詢性能,因而有了Term Index,就像字典裏的索引頁同樣,A開頭的有哪些Term,分別在哪頁,能夠理解Term Index是一顆樹:
ElasticSearch學習筆記
Term Index不須要存下全部的Term,而僅僅是它們的一些前綴與Term Dictionary的Block之間的映射關係,再結合相關的壓縮技術,可使Term Index緩存到內存中。從Term Index查到對應的Term Dictionary的Block位置以後,再去磁盤上找Term,大大減小了磁盤隨機讀的次數。

爲何 Elasticsearch/Lucene 檢索能夠比 MySQL快

MySQL 只有 Term Dictionary 這一層,是以 B+Tree 排序的方式存儲在磁盤上的。檢索一個 Term 須要若干次的 Random Access 的磁盤操做。

Lucene 在 Term Dictionary 的基礎上添加了 Term Index 來加速檢索,Term Index 以樹的形式緩存在內存中。從 Term Index 查到對應的 Term Dictionary 的 Block 位置以後,再去磁盤上找 Term,大大減小了磁盤的 Random Access 次數。
ElasticSearch學習筆記

值得一提的兩點是:
Term Index 在內存中是以 FST(finite state transducers)的形式保存的,其特色是很是節省內存。

Term Dictionary 在磁盤上是以分 Block 的方式保存的,一個 Block 內部利用公共前綴壓縮,好比都是 Ab 開頭的單詞就能夠把 Ab 省去。這樣 Term Dictionary 能夠比 B-Tree 更節約磁盤空間。

什麼是ELK

ELK 是elastic公司提供的一套完整的日誌收集以及展現的解決方案,分別表示:ElasticSearch , Logstash, Kibana。

ElasticSearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。

Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。

Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。
ElasticSearch學習筆記

安裝ElasticSearch

因爲官網下載較慢,下方連接爲華爲雲的鏡像。

ElasticSearch:
https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D

選好本身的版本,下載壓縮包。
ElasticSearch學習筆記
我選擇的是7.6.2的Windows版本,須要清晰知道本身下載的版本,後面下載kibana等都必須版本一致

下載完成後解壓。
ElasticSearch學習筆記
重點關注一下config文件夾中的 jvm.options
ElasticSearch學習筆記
不少同窗一啓動立刻閃退,就是由於這裏的內存設置過大,按照本身電腦配置進行設置,1g閃退就設置512M,以此類推。
ElasticSearch學習筆記
接着咱們打開bin目錄中的elasticsearch.bat
ElasticSearch學習筆記

出現下面圖片,在瀏覽器輸入紅框地址。
ElasticSearch學習筆記
出現下方 json格式則安裝成功
ElasticSearch學習筆記

安裝ik分詞器

打開下方網址,找到和本身elasticsearch同樣版本的下載。
https://github.com/medcl/elasticsearch-analysis-ik/releases

下載完成後,將其解壓到elasticsearch文件夾中的plugins,因爲ik分詞器是elasticsearch的一個插件,elasticsearch的插件都是放在plugins中的。
ElasticSearch學習筆記
ElasticSearch學習筆記
重啓elasticsearch,觀察其啓動界面的命令行是否出現下圖
ElasticSearch學習筆記
出現了即安裝ik插件成功。

測試ik分詞器

ElasticSearch學習筆記
安裝成功後咱們打開Kibana能夠嘗試一下ik分詞器如何使用。

ElasticSearch學習筆記

IK分詞器的兩種分詞模式

IK分詞器有兩種分詞模式:ik_max_wordik_smart模式。

  • ik_max_word
    會將文本作最細粒度的拆分,好比會將「中華人民共和國人民大會堂」拆分爲「中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

  • ik_smart
    會作最粗粒度的拆分,好比會將「中華人民共和國人民大會堂」拆分爲中華人民共和國、人民大會堂。

點擊小三角形對該陰影區域的json的text進行分詞

ik_smart
ElasticSearch學習筆記
ik_max_word

ElasticSearch學習筆記

{ "tokens" : [ { "token" : "中華人民共和國", "start_offset" : 0, "end_offset" : 7, "type" : "CN_WORD", "position" : 0 }, { "token" : "中華人民", "start_offset" : 0, "end_offset" : 4, "type" : "CN_WORD", "position" : 1 }, { "token" : "中華", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 2 }, { "token" : "華人", "start_offset" : 1, "end_offset" : 3, "type" : "CN_WORD", "position" : 3 }, { "token" : "人民共和國", "start_offset" : 2, "end_offset" : 7, "type" : "CN_WORD", "position" : 4 }, { "token" : "人民", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 5 }, { "token" : "共和國", "start_offset" : 4, "end_offset" : 7, "type" : "CN_WORD", "position" : 6 }, { "token" : "共和", "start_offset" : 4, "end_offset" : 6, "type" : "CN_WORD", "position" : 7 }, { "token" : "國人", "start_offset" : 6, "end_offset" : 8, "type" : "CN_WORD", "position" : 8 }, { "token" : "人民大會堂", "start_offset" : 7, "end_offset" : 12, "type" : "CN_WORD", "position" : 9 }, { "token" : "人民大會", "start_offset" : 7, "end_offset" : 11, "type" : "CN_WORD", "position" : 10 }, { "token" : "人民", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 11 }, { "token" : "大會堂", "start_offset" : 9, "end_offset" : 12, "type" : "CN_WORD", "position" : 12 }, { "token" : "大會", "start_offset" : 9, "end_offset" : 11, "type" : "CN_WORD", "position" : 13 }, { "token" : "會堂", "start_offset" : 10, "end_offset" : 12, "type" : "CN_WORD", "position" : 14 } ] } 

ik分詞器添加自定義詞庫

當有一些自造詞須要ik分詞器進行分詞時,能夠打開在ik分詞器的解壓文件夾中的config
ElasticSearch學習筆記
新建一個文檔將自造詞放進去便可,記得要把文檔後綴改成dic,編碼爲UTF-8
ElasticSearch學習筆記

ElasticSearch學習筆記

保存後,打開IKAnalyzer.cfg.xml
ElasticSearch學習筆記
ElasticSearch學習筆記
將本身詞典的文件名填寫進去,保存,添加成功,重啓es。

安裝ElasticSearch-head

elasticsearch-head將是一款專門針對於elasticsearch的客戶端工具,包括數據可視化,增刪改查工具,es語句的可視化等等。

下載地址:
https://github.com/mobz/elasticsearch-head

和elasticsearch安裝同樣,將解壓包解壓,進入elasticsearch-head的文件夾
ElasticSearch學習筆記

進入解壓路徑的命令行
ElasticSearch學習筆記
執行 npm install

執行 npm run start
ElasticSearch學習筆記
在瀏覽器訪問http://localhost:9100,可看到以下界面,表示啓動成功:
ElasticSearch學習筆記

安裝Kibana

依舊是華爲雲的鏡像

Kibana
https://mirrors.huaweicloud.com/kibana/?C=N&O=D

選擇和你的ElasticSearch同樣的版本下載,和es同樣解壓便可用
ElasticSearch學習筆記
因爲Kibana默認是英文,咱們須要進入config文件夾中的kibana.yml
ElasticSearch學習筆記
在末尾加入i18n.locale: "zh-CN",更改保存,讓國際化變成中文。
ElasticSearch學習筆記
接着進入bin目錄打開kibana.bat,出現下方界面。
ElasticSearch學習筆記
在瀏覽器打開http://localhost:5601,進入下方頁面即安裝成功。
ElasticSearch學習筆記

ElasticSearch學習筆記

REST風格說明

什麼是REST風格

REST是一種軟件架構風格,或者說是一種規範,其強調HTTP應當以資源爲中心,而且規範了URI的風格;規範了HTTP請求動做(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具備對應的語義。

基本REST命令說明

ElasticSearch學習筆記

PUT命令

建立一個demo索引的 type類型下保存1號數據爲 「name」: 「小黃」, 「age」:21

PUT demo/type/1
{ "name": "小黃", "age":21 } 

建立成功
ElasticSearch學習筆記
對照着和關係型數據庫的聯繫理解
ElasticSearch學習筆記

建立類型

不填寫時,默認爲_.doc類型,在將來8.多的版本具體類型可能會被拋棄。

指定某個字段使用指定類型,常見類型有下圖:
ElasticSearch學習筆記
咱們在下方建立了一個test2的索引裏面的字段和對應的類型
ElasticSearch學習筆記

插入數據

這裏在demo索引下的插入了4個記錄

PUT demo/type/1
{ "name": "小黃1.0", "age":21 } PUT demo/type/2 { "name": "小黃2.0", "age":21 } PUT demo/type/3 { "name": "小黃3.0", "age":21 } PUT demo/type/4 { "name": "小黃4.0", "age":21 } 

ElasticSearch學習筆記

更新數據

假設我須要更新name爲小黃2.0,直接在對應的字段更改爲對應數據便可,須要將不修改字段的數據也寫上去,不然將會被空白覆蓋

PUT demo/type/1 # 更新id爲1的數據 { "name": "小黃2.0", "age":21 #即便21不用修改仍是須要寫 } 

ElasticSearch學習筆記
修改後 _version增長

POST命令

POST能夠不帶ID發送,ES會自動生成一個ID,若是再次請求也會再次新增一個ID

POST demo/type
{ "name": "小黃", "age":21 } 

ElasticSearch學習筆記
能夠看到自動生成一個ID爲 5IF1dncBdbJa8wg0om_V

更新數據(推薦使用)

POST同樣能夠更新數據,只須要在最後加上須要修改的ID號和/_update,加上 「doc」:{}包圍須要修改的數據字段便可,不須要將不修改的數據寫上去。

POST demo/type/1/_update
{ "doc":{ "name": "小黃3.0" } } 

ElasticSearch學習筆記

DELETE命令

DELETE demo #刪除demo索引 
DELETE demo/type/1  #刪除demo索引下的1號文檔 

根據請求判斷刪除索引仍是文檔記錄

GET命令

查詢數據(重點)

GET demo  #獲取索引信息 

ElasticSearch學習筆記

GET demo/type/1 #獲取demo索引的 type類型下保存1號數據 

ElasticSearch學習筆記

_index:表示在哪一個索引下

_type:類型

_id:添加時的id

_version:版本號

_seq_no:併發控制字段,序列號,每次更新+1 (樂觀鎖操做使用)

_primary_term:分片,做用同上,重啓會變化

_source:真正的內容

精確查詢

term查詢是直接經過倒排索引指定的詞條進行精確查找的

GET demo/type/_search
{ "query": { "term": { "age": "21" } } } 

match會使用分詞器解析(先分析文檔,在經過分析的文檔進行查詢)

keyword類型數據不能被分詞器解析
ElasticSearch學習筆記
而其餘類型能夠被分詞器解析

查詢字符串搜索

將具備"黃"的數據所有搜索出來

GET demo/type/_search?q=name:黃 
#! Deprecation: [types removal] Specifying types in search requests is deprecated. { "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 0.10536051, "hits" : [ { "_index" : "demo", "_type" : "type", "_id" : "1", "_score" : 0.10536051, "_source" : { "name" : "小黃1.0", "age" : 21 } }, { "_index" : "demo", "_type" : "type", "_id" : "2", "_score" : 0.10536051, "_source" : { "name" : "小黃2.0", "age" : 21 } }, { "_index" : "demo", "_type" : "type", "_id" : "3", "_score" : 0.10536051, "_source" : { "name" : "小黃3.0", "age" : 21 } }, { "_index" : "demo", "_type" : "type", "_id" : "4", "_score" : 0.10536051, "_source" : { "name" : "小黃4.0", "age" : 21 } } ] } } 

hits:顯示索引和文檔信息,查詢總結果數,權重, 具體文檔,數據中的東西均可以遍歷出來

_score:表示權重,越高表示該數據和搜索字段越匹配。因爲我上面的數據格式同樣,都只具備一個"黃"因此權重同樣,都是0.10536051。

查詢全部結果

GET demo/type/_search
{ "query":{"match_all":{}} } 

條件查詢

GET demo/type/_search
{ "query":{ "match":{ "name":"黃" } } } 

布爾查詢

使用 "bool":{} 聲明使用布爾查詢

must等同於MySQL中的 and

GET demo/type/_search
{ "query": { "bool": { "must": [ { "match": { "name": "huang" } }, { "match": { "age": 21 } } ] } } } 

should等同於MySQL中的 or

filter條件過濾查詢,過濾條件的範圍用range表示gt表示大於、lt表示小於、gte表示大於等於、lte表示小於等於)

GET demo/type/_search
{ "query": { "bool": { "must": [ { "match": { "name": "黃" } } ], "filter": { "range": { "age": { "gte": 10, "lt": 27 } } } } } } 

按排序查詢

GET demo/type/_search
{ "query":{ "match":{ "name":"黃" } }, "sort":[ { "age":"desc" #降序 } ] } 

分頁查詢

GET demo/type/_search
{ "query":{"match_all":{}}, "from":0, "size":2 #從零開始查詢全部記錄,每頁只顯示2條記錄 } 

指定查詢結果的字段

GET demo/type/_search
{ "query":{"match_all":{}}, "_source":["name","age"] } 

高亮查詢

搜索出name爲小黃1.0的數據,並將其name字段高亮顯示

GET demo/type/_search
{ "query":{ "match_phrase":{ "name":"小黃1.0" } } , "highlight":{ "fields":{ "name":{} } } } 

ElasticSearch學習筆記
自定義搜索高亮字段格式先後綴
ElasticSearch學習筆記

ElasticSearch學習筆記

拓展

GET  _cat/nodes #查看全部節點 

ElasticSearch學習筆記

GET  _cat/health #查看es健康情況 

ElasticSearch學習筆記

GET  _cat/master #查看主節點 

ElasticSearch學習筆記

GET  _cat/indices #查看全部索引 == MySQL中的show databases 

ElasticSearch學習筆記

參考:
https://www.bilibili.com/video/BV17a4y1x7zq
http://www.mybatis.cn/archives/1112.html
https://www.jianshu.com/p/c96576fcbcd9

轉:

ElasticSearch學習筆記

相關文章
相關標籤/搜索