Elasticsearch入門,看這篇就夠了

我將會從下面四個方面去介紹 Elasticsearch。

 

目錄

一、Elasticsearch是什麼?
二、Elasticsearch全文檢索的原理是什麼?
三、Elasticsearch的核心數據類型有哪些?
四、怎麼判斷搜索準確性?

 

一、Elasticsearch是什麼?

Elasticsearch是一個實時的分佈式搜索分析引擎,它可以使你以前所未有的速度和規模,去探索你的數據。

它被用來做全文檢索結構化搜索分析以及這三個功能的組合:

  • Wikipedia使用Elasticsearch提供了高亮片段的全文搜索,還有search-as-you-type和did-you-mean的建議。
  • 衛報使用Elasticsearch將其社交媒體提供給公衆有關新文章的實時反饋。
  • Stack Overflow將定位查詢整合到全文檢索中去,並使用more-like-this接口去查找相關的問題和回答。
  • GitHub使用Elasticsearch對1300億行代碼進行查詢。

(這是官方的簡介)

 

ES的生態圈

ES生態圈主要包含這幾個好基友。

 

ES的用途

(1)用作搜索系統數據存儲

  1. 應用程序將數據寫入到mysql或其他數據庫當中
  2. mysql把數據同步到ES中
  3. 應用程序查詢數據時,從ES中搜索數據

(2)用作日誌分析

  1. 日誌通過kafka傳到Logstash進行日誌數據聚合
  2. Logstash將日誌存儲到ES中
  3. 通過Grafna或者Kibana對數據進行監控和分析

ES的特點和優勢

  1. 分佈式實時文件存儲,可將每一個字段存入索引,使其可以被檢索到
  2. 實時分析的分佈式搜索引擎,分佈式,索引拆分成多個分片,集羣中的數據節點可以承載一個或多個分片,並且協調和處理各種操作,負載再平衡和路由大多數情況下自動完成。
  3. 可以擴張到上百臺服務器,處理PB級別的結構化和非結構化數據,也可以運行在單臺PC上。
  4. 支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件。

 

幾個重要概念

文檔
  • Elasticsearch 是面向文檔的,文檔是所有可搜索數據的最小單位
  • Elasticsearch裏面的文檔是以 JSON 的格式保存。
  • 每個文檔都有一個唯一的 Doc ID

文檔相當於關係型數據庫的一行記錄

舉例:下圖的JSON格式數據就是一個文檔

索引(index)

索引是文檔的容器,是一類文檔的集合

索引需要定義Mapping和Settings

  • Mapping定義文檔字段的類型
  • Settings定義不通的字段分佈,比如說你的索引需要多少個分片

索引相當於關係型數據庫的一個表

舉例:下面的結構是一個索引

分詞

分詞是把全文本轉換成一系列單詞的過程。

分詞器是處理分詞的模塊。

分詞器的處理過程可以分爲三個步驟:

  1. Character Filters 處理原始文本,比如說去除html標籤
  2. Tokenizer 按照一些規則,將文本切分成一個個單詞
  3. Token Filters 將切分後的單詞進行加工,例如:單詞轉小寫、過濾停用詞、增加同義詞等

處理中文分詞的第三方插件:analysis-icu、IK、THULAC

安裝 analysis-icu 插件的方式

elasticsearch-plugin install analysis-icu
REST API

ES支持http協議訪問數據,增刪改查都提供了相應的REST API

集羣(Cluster)

Elasticsearch是分佈式架構,一個集羣可以有一個或多個節點。

分佈式架構的好處

  • 方便對存儲水平擴容
  • 提高系統高可用性,部分節點停止服務,整個集羣的服務不受影響

集羣配置有兩種方式:

(1)配置文件

vim config/elasticsearch.yml

cluster.name: dmall_xxx

(2)命令行指定

在命令行啓動ES時,指定參數 -E cluster.name=xxx 進行設定。

節點(node)

節點是Elasticsearch的一個實例,本質上是一個java進程。

一臺機器可以運行多個Elasticsearch進程,但生產環境中一般建議一臺機器只運行一個es實例。

節點配置有兩種方式:

(1)配置文件

vim config/elasticsearch.yml

node.name: dmall_xxx_node1 

(2)命令行指定

在命令行啓動ES時,指定參數 -E node.name=node1 進行設定。

每個節點啓動之後,會分配一個UID,保存在data目錄下。

分片(shard)

主分片(Primary Shard)

分片是一個運行的 Lucene 實例,ES可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上,構成分佈式搜索。這個過程對用戶來說是透明的。

主分片在索引創建時指定,後續不允許修改,除非 Reindex。

使用分片有兩個優點:

  1. 可以水平擴展。
  2. 可以併發提高性能。

副本(Replica Shard)

用以解決數據高可用的問題。副本是對主分片的拷貝。

  • 副本分片數,可以同臺調整
  • 增加副本數,還可以在一定程度上,提高服務的高可用性(讀取的吞吐)

 

二、Elasticsearch全文檢索的原理是什麼?

這裏先解釋什麼是正排索引,什麼是倒排索引。

正排索引

好比一本書的目錄。

我們通過書本的目錄,找到相關內容的頁碼,再去查詢該頁碼下,我們想要查找的內容。

圖片來源於網絡

倒排索引

主要是爲了解決:你想知道某個關鍵詞,在書中的哪一頁出現過,這類的問題。

倒排索引需要把文本拆分成一個一個單詞,並且標記這個單詞在文本中的位置,當我們想查找與某個關鍵詞相關的文本內容時,我們通過倒排索引查找,就可以很輕易找到我們想要查找的內容。

圖片來源於網絡

全文搜索引擎也是通過倒排索引去實現的。

例如:通過百度搜索“倒排索引”,我們的關鍵詞是“倒排索引”。

百度搜索引擎就可以將與“倒排索引”相關的網頁內容進行聚合,並且對查詢到的結果集合中的每一個網頁進行相關性打分,分值高的會排在前面。

 

三、Elasticsearch的核心數據類型有哪些?

 

四、怎麼判斷搜索準確性?

下圖的圖示中,

綠色的圓圈,表示應該被返回的結果

橙色的三角形,表示不應該被返回的結果

True Positive(TP):應該返回的結果,被返回

False Positive(FP):不應該返回的結果,被返回

True Negatives(TN):應該返回的結果,不被返回

False Negatives(FN):不應該返回的結果,不被返回

 

關於作者

github:https://github.com/GitDzreal93/dev-tester
微信公衆號:測試開發guide

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章