目录
核心概念
- 在新版
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可以改变
常见操作
索引的常见操作
- 查看索引列表
bash
GET /_cat/indices?v=true&pretty
- 查看分片情况
bash
GET /_cat/shards?v=true&pretty
- 创建索引(Create Index)
bash
PUT /<index_name>
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
- 查看索引是否存在( 结果是200 和 404)
bash
HEAD /<index_name>
- 获取索引(Get Index)
bash
GET /<index_name>
- 更新索引设置(Update Index Settings)
bash
PUT /<index_name>/_settings
{
"settings": {
"number_of_replicas": 2
}
}
- 删除索引(Delete Index)
bash
DELETE /<index_name>
常见的数据类型
- Text类型:用于全文本搜索的文本类型
- Keyword类型:用于精确匹配和聚合操作的关键字类型
- Numeric类型:包括整数类型(long、integer、short、byte)和浮点数类型(double、float)
- Date类型:用于存储日期和时间的类型
- Boolean类型:用于存储布尔值(true或false)的类型
- Binary类型:用于存储二进制数据的类型
- Array类型:用于存储数组或列表数据的类型
- Object类型:用于存储复杂结构数据的类型
指定索引库字段类型mapping
bash
PUT /my_index
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"title": {
"type": "text"
},
"price": {
"type": "float"
}
}
}
}
查看索引库的字段类型
bash
GET /<index_name>/_mapping
GET /my_index/_mapping
最高频使用的数据类型
-
text字段类型
- text类型主要用于全文本搜索,适合存储需要进行全文本分词的文本内容,如文章、新闻等
- text字段会对文本内容进行分词处理,将文本拆分成独立的词项(tokens)进行索引
- 分词的结果会建立倒排索引,使搜索更加灵活和高效
- text字段在搜索时会根据分词结果进行匹配,并计算相关性得分,以便返回最佳匹配的结果
-
keyword字段类型
- keyword类型主要用于精确匹配和聚合操作,适合存储不需要分词的精确值,如ID、标签、关键字等
- keyword字段不会进行分词处理,而是将整个字段作为一个整体进行索引和搜索
- 这使得搜索只能从精确的值进行匹配,而不能根据词项对内容进行模糊检索
- keyword字段适合用于过滤和精确匹配,同时可以进行快速的基于精确值的聚合操作
-
类型选择
- 在选择text字段类型和keyword字段类型时,需要根据具体的需求进行权衡和选择
- 如果需要进行全文本检索,并且希望根据分词结果计算相关性得分,以获得最佳的匹配结果,则选择text字段类型
- 如果需要进行精确匹配、排序或聚合操作,并且不需要对内容进行分词,则选择keyword字段类型