目錄
- 核心概念
- 概念總結
- 常見操作
- 索引的常見操作
- 常見的數據類型
- 指定索引庫字段類型`mapping`
- 查看索引庫的字段類型
- 最高頻使用的數據類型
核心概念
- 在新版
Elasticsearch
中,文檔document
就是一行記錄(json
),而這些記錄存在于索引庫(index
)中, 索引名稱必須是小寫
- 與關系型數據庫對比
Mysql | Elastic Search |
---|---|
Table(水平分表) | Index(不同分片) |
Row | Document |
Column | Field |
- index(索引)
- 在新版本中的Elasticsearh中,索引的概念等同于Mysql中表的概念,Elasticsearch中的索引可以直接存儲數據
- document(文檔)
- 真正的數據,存儲一條數據就是一份文檔,存儲格式為JOSN,等同于mysql中的一條數據
- shards(分片)
- 數據量特大,沒有足夠大的硬盤空間來一次性存儲,且一次性搜索那么多的數據,響應跟不上
- ES提供把數據進行分片存儲,這樣方便進行拓展和提高吞吐
- replicas(副本)
- 分片的拷貝,當主分片不可用的時候,副本就充當主分片進行使用
- 索引分片的備份,
shard
和replica
一般存儲在不同的節點
上,用來提高可靠性 - 案例
- 假如
Elasticsearch
中的每個索引分配5個主分片
和1個副本 - 如果集群中至少有兩個節點,索引將會有5個主分片和另外5個復制分片(1個完全拷貝)這樣每個索引總共有10個分片
- 假如
概念總結
- 數據切分為多個分片是為了提高可處理數據的容量和方便后續水平擴展
- 分片做副本是為了提高集群的穩定性,提高容災特性和吞吐量
- 副本越多 數據越高可用,但是消耗的資源就越多
- 分片越多數據就會越分散,避免數據過于集中導致某個節點壓力過大
- 副本和分片的數量不一定是越多越好
- 過多的分片,會占用大量的CPU以及內存等資源
- 過多的副本,副本之間數據同步的會占用大量網絡資源等
- ES默認為一個索引創建1個主分片和1個副本,在創建索引的時候使用settings屬性指定,每個分片必須有零到多個副本
- 注意:索引一旦創建成功,主分片primary shard數量不可以變(只能重建索引),副本分片replica shard可以改變
常見操作
索引的常見操作
- 查看索引列表
GET /_cat/indices?v=true&pretty
- 查看分片情況
GET /_cat/shards?v=true&pretty
- 創建索引(Create Index)
PUT /<index_name>
{"settings": {"number_of_shards": 1,"number_of_replicas": 1}
}
- 查看索引是否存在( 結果是200 和 404)
HEAD /<index_name>
- 獲取索引(Get Index)
GET /<index_name>
- 更新索引設置(Update Index Settings)
PUT /<index_name>/_settings
{"settings": {"number_of_replicas": 2}
}
- 刪除索引(Delete Index)
DELETE /<index_name>
常見的數據類型
- Text類型:用于全文本搜索的文本類型
- Keyword類型:用于精確匹配和聚合操作的關鍵字類型
- Numeric類型:包括整數類型(long、integer、short、byte)和浮點數類型(double、float)
- Date類型:用于存儲日期和時間的類型
- Boolean類型:用于存儲布爾值(true或false)的類型
- Binary類型:用于存儲二進制數據的類型
- Array類型:用于存儲數組或列表數據的類型
- Object類型:用于存儲復雜結構數據的類型
指定索引庫字段類型mapping
PUT /my_index
{"mappings": {"properties": {"id": {"type": "keyword"},"title": {"type": "text"},"price": {"type": "float"}}}
}
查看索引庫的字段類型
GET /<index_name>/_mappingGET /my_index/_mapping
最高頻使用的數據類型
-
text字段類型
- text類型主要用于全文本搜索,適合存儲需要進行全文本分詞的文本內容,如文章、新聞等
- text字段會對文本內容進行分詞處理,將文本拆分成獨立的詞項(tokens)進行索引
- 分詞的結果會建立倒排索引,使搜索更加靈活和高效
- text字段在搜索時會根據分詞結果進行匹配,并計算相關性得分,以便返回最佳匹配的結果
-
keyword字段類型
- keyword類型主要用于精確匹配和聚合操作,適合存儲不需要分詞的精確值,如ID、標簽、關鍵字等
- keyword字段不會進行分詞處理,而是將整個字段作為一個整體進行索引和搜索
- 這使得搜索只能從精確的值進行匹配,而不能根據詞項對內容進行模糊檢索
- keyword字段適合用于過濾和精確匹配,同時可以進行快速的基于精確值的聚合操作
-
類型選擇
- 在選擇text字段類型和keyword字段類型時,需要根據具體的需求進行權衡和選擇
- 如果需要進行全文本檢索,并且希望根據分詞結果計算相關性得分,以獲得最佳的匹配結果,則選擇text字段類型
- 如果需要進行精確匹配、排序或聚合操作,并且不需要對內容進行分詞,則選擇keyword字段類型