天天看點

ElasticSearch實戰(二)-核心概念之NRT/Document/Index/分片/副本1 lucene VS elasticsearch2 核心概念3 RESTful API(REpresentational State Transfer)

1 lucene VS elasticsearch

lucene,最先進、功能最強大的Java搜尋類庫。直接基于lucene開發,非常複雜,api複雜(實作簡單功能,寫大量java代碼),需要深入了解原理(各種索引結構)。

elasticsearch,基于lucene,隐藏複雜性,提供簡單易用的restful api接口、java api接口(還有其他語言的api接口)

(1)分布式的文檔存儲引擎

(2)分布式的搜尋引擎和分析引擎

(3)分布式,支援PB級資料

開箱即用,優秀的預設參數,不需要任何額外設定,完全開源。

2 核心概念

2.1 近實時-Near Realtime(NRT)

從寫入資料到資料可以被搜尋到有一個小延遲(大概1秒),基于es執行搜尋和分析可以達到秒級。

2.2 叢集-Cluster

包含多個節點,每個節點屬于哪個叢集是通過一個配置(叢集名稱,預設是elasticsearch)決定。

對于中小型應用來說,剛開始一個叢集就一個節點很正常。

2.3 節點-Node

叢集中的一個節點,節點也有一個名稱(預設是随機配置設定的),節點名稱很重要(在執行運維管理操作的時候),預設節點會去加入一個名稱為“elasticsearch”的叢集,如果直接啟動一堆節點,那麼它們會自動組成一個elasticsearch叢集,當然一個節點也可以組成一個elasticsearch叢集

2.4 索引-Index(表)

由具有相同字段的文檔清單組成,包含一堆相似結構的文檔資料。

比如可以有一個客戶索引,商品分類索引,訂單索引。索引有一個名稱

一個index包含很多document,一個index就代表了一類類似/相同的document。

比如建立一個product index 商品索引,裡面可能就存放了所有的商品資料(商品document)。

索引中存儲具有相同結構的文檔(Document)

  • 每個索引都有自己的

    mapping

    定義(類似 MySQL 的 schema),用于定義字段名和類型
  • 一個叢集可以有多個索引,比如
    • nginx日志存儲的時候可以按照日期每天生成一個索引來存儲

nginx-log-2020-01-01

nginx-log-2020-01-02

nginx-log-2020-01-03

2.5 Document & field(行 & 列)

document

JSON結構,使用者存儲在 ES 中的資料文檔。一個document可以是一條客戶資料,一條商品分類資料,一條訂單資料。由字段 Filed 組成。

每個文檔有唯一的id辨別:

  • 自行指定
  • es自動生成

資料類型

  • 字元串

    text、keyword

  • 數值型

    long、integer、short, byte, double, float half_float, scaled_float

  • 布爾

    boolean

  • 日期

    date

  • 二進制

    binary

  • 範圍

    integer_range, float_range, long_range, double_range, date_ range

中繼資料-用于标注文檔的相關資訊

  • _ index: 文檔所在的索引名
  • _type: 文檔所在的類型名
  • _id:文檔唯一id
  • _uid:組合id,由type和. jid 組成(ES 6.x開始

    _type

    不再起作用,同_id)
  • _source:文檔原始JSON資料,存儲了文檔的完整原始資料,可從這裡擷取每個字段内容
  • _all:整合所有字段内容到該字段,預設禁用,因其針對所有字段内容分詞,很占磁盤空間

field

每個index下的type,都可以存儲多個document。一個document裡面有多個field,每個field就是一個資料字段列。

product document
{
  "product_id": "1",
  "product_name": "JavaEdge 公衆号",
  "product_desc": "全是技術幹貨",
  "category_id": "2",
  "category_name": "技術追求"
}      

2.6 shard

單台機器無法存儲大量資料,es可以将一個索引中的資料切分為多個shard,分布在多台伺服器上存儲

有了shard就可以橫向擴充,存儲更多資料,讓搜尋和分析等操作分布到多台伺服器上去執行,提升吞吐量和性能

每個shard都是一個lucene index。

2.7 replica

任何一個伺服器随時可能故障或當機,此時shard可能就會丢失,是以可以為每個shard建立多個replica副本。

replica可以在shard故障時提供備用服務,保證資料不丢失,多個replica還可以提升搜尋操作的吞吐量和性能。primary shard(建立索引時一次設定,不能修改,預設5個),replica shard(随時修改數量,預設1個),預設每個索引10個shard,5個primary shard,5個replica shard,最小的高可用配置,是2台伺服器。

  • shard和replica的解釋
ElasticSearch實戰(二)-核心概念之NRT/Document/Index/分片/副本1 lucene VS elasticsearch2 核心概念3 RESTful API(REpresentational State Transfer)

類型 Type(表邏輯類型)ES 7.x中已廢除

每個index都可有一或多個type,type是index的一個邏輯資料分類。

一個type下的document,都有相同field。

比如部落格系統,有一個索引,可定義使用者資料type,部落格資料type,評論資料type。

商品index,裡面存放了所有的商品資料,商品document

但是商品分很多種類,每個種類的document的field可能不太一樣

比如說電器商品,可能還包含一些諸如售後時間範圍這樣的特殊field;生鮮商品,還包含一些諸如生鮮保存期限之類的特殊field

type,日化商品type,電器商品type,生鮮商品type

日化商品type:product_id,product_name,product_desc,category_id,category_name
電器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
生鮮商品type:product_id,product_name,product_desc,category_id,category_name,eat_period      

每個type裡,包含一堆document

{
  "product_id": "2",
  "product_name": "長虹電視機",
  "product_desc": "4k高清",
  "category_id": "3",
  "category_name": "電器",
  "service_period": "1年"
}
{
  "product_id": "3",
  "product_name": "基圍蝦",
  "product_desc": "純天然,冰島産",
  "category_id": "4",
  "category_name": "生鮮",
  "eat_period": "7天"
}      

3 RESTful API(REpresentational State Transfer)

Elasticsearch 叢集對外提供RESTful API

  • URI 指定資源 , 如 Index、Document等
  • Http Method 指明資源操作類型,如GET、POST、 PUT、DELETE

互動方式

  • curl 指令行
  • Kibana DevTools
  • ElasticSearch實戰(二)-核心概念之NRT/Document/Index/分片/副本1 lucene VS elasticsearch2 核心概念3 RESTful API(REpresentational State Transfer)