1. es的基本概念
Elasticsearch底层是基于Lucene实现的一个搜索引擎,主要应用于:日志检索、Mysql实时数据快照、分布式文档数据库、搜索引擎等业务场景;
Elasticsearch包含了非常多的名词,想学习Elasticsearch最好先了解一下这些名词是什么意思;
Index 索引:
一个索引(index)就像是RDBS中的数据库,它是相关文档存储的地方;
Type 类型:
可以简单的理解为数据库的表,它存在的初衷是对数据分类;
Document 文档:
Elasticsearch是面向文档的,这意味着索引和搜索数据的最小单位是文档;它类似于数据库中的记录;
Field 字段:
指Document中的某一个数据字段,类似数据库中的列;
Cluster 集群:
表示由多个node组成的ES集群;
Node 节点:
一个安装了ES的服务,如果cluster.name相同,则表示在同一个集群;
shard 分片:
一个Index如果非常大的情况下,可以对一个Index进行分片,以减少磁盘中index的大小;
replica 副本:
在ES集群的情况与,可以将index存在多台机器上,以防止某一台机器宕机造成数据丢失问题;
2. es的基本操作
2.1 Index的基本操作
2.1.1 创建Index:
PUT /student <1>
{
"settings": {
"number_of_shards": 5, <2>
"number_of_replicas": 1 <3>
}
}
<1>:指定创建索引的名称;
<2>:设置索引相关配置,配置索引的分片个数;
<3>:设置每个分片的副本数量;
2.1.2 查询Index:
GET /student
2.1.3 删除Index:
DELETE /student
2.1.4 查询所有Index
GET _cat/indices
2.2 mapping
2.2.1 Es中的数据类型
| 分类 | 名称 | 范围 | 备注 |
|---|---|---|---|
| 字符型 | text | 全文检索 | 将会对field分词 |
| keyword | 关键词 | 不会对文本进行分词 | |
| 整数型 | byte | -128~127 | |
| short | -32768~32767 | ||
| integer | -2^31~2^31-1 | ||
| long | -2^63~2^63-1 | ||
| 浮点型 | float | 32位单精度IEEE 754浮点类型 | 占用4字节,也32位 |
| doule | 64位双精度IEEE 754浮点类型 | 占用8字节,64位 | |
| half_float | 16位半精度IEEE 754浮点类型 | ||
| scaled_float | 缩放类型的的浮点数 | { "price": { "type": "scaled_float", "scaling_factor": 100 } } | |
| 注 对于前三种 -0.0和+0.0是不同的值。 scaled_float指定的比例因子表示price的值会X以100再取一个接近原始值的数存储 | |||
| 时间类型 | date | ①格式化的date字符串,例如"2020-10-01"或者"2020-10-01 00:00:00" ②一个long型的数字,代表从1970年1月1号0点到现在的毫秒数 ③一个integer型的数字,代表从1970年1月1号0点到现在的秒数 | "createTime": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } |
| 布尔类型 | boolean | true/false | |
| 二进制类型 | binary | 进制字段是指用base64来表示索引中存储的二进制数据 | |
| 区间类型 | integer_range | 例如:"age" : { "gte" : 10, "lte" : 20 } | 保存值是需要指定范围。格式:"age": { "type": "integer_range" } |
| float_range | |||
| long_range | |||
| double_range | |||
| date_range | |||
| ip_range | ip地址范围 | ||
| 复合类型 | array | [ “one”, “two” ] | 保存多个值 |
| object | JSON对象 | ||
| 更多数据类型 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html | |||
2.2.2 创建索引时指定Mapping
PUT /book
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"java":{ # type的名称,比如我们创建的type的名称为java
"properties":{ # 文档存储的field
"name":{ # field属性名
"type":"text",
"analyzer":"ik_max_word", # 指定分词器
"index":true, # 指定当前的field可以被作为查询的条件
"store":false # 是否需要额外存储
},
"author":{
"type":"keyword"
},
"count":{
"type":"long"
},
"on-sale":{
"type":"date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"descr":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
}
}
也可以不指定mapping,不指定的时候默认ES按存储的数据自动生成一个数据类型;
比如上面的mapping中并没有指定price,但添加文档时一样可以添加price,但此时price的类型是由ES自动生成的;
查看mapping:
GET /book/_mapping
修改mapping:
mapping只允许添加某个field的类型,不允许修改某field的类型;原因简单的说就是修改类型影响已经建立的索引;
2.3 Type的基本操作
Type没有什么特别的操作;
有关Type需要多说几句,上面提到过Type类似于数据库中的表,但Type在不同Es版本中有不同的体现: 6.0之后一个Index下能有一个Type,8.0之后去掉了Type;
Type为什么在新版本中会被删除呢?
- es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致;
- 不同类型的“记录”存储在同一个index中,会影响lucene的压缩性能;
2.4 Document的基本操作
2.4.1 向Type中插入文档:
POST /book/java
{
"name":"es权威指南",
"author":"clinton gormley,zachary tong",
"count":1000,
"on-sale":"2020-10-10",
"descr":"这是一本关于ES的教程"
}
插入数据时未指定类型的情况下,默认自动生成一个id
POST /book/java/1 # 指定id为1
{
"name":"java编程思想",
"author":"java",
"count":1000,
"on-sale":"2020-10-10",
"descr":"这是一本关于java的教程"
}
2.4.2 修改文档:
整个文档修改:
PUT /book/java/1
{
"name":"java编程思想1",
"author":"java1",
"count":1000,
"on-sale":"2020-10-10",
"descr":"这是一本关于java的教程1"
}
注意:修改文档的时候用的是PUT请求;
部分Field修改:
POST /book/java/1/_update
{
"doc":{
"count":123 # 指定需要修改的field和对应的值
}
}
2.4.3 删除文档:
DELETE /book/java/1
2.4.4 批量查询文档:
GET /book/java/_mget
{
"ids" : [ "2", "1" ]
}
如果id=2并不存的话,也不影响id=1的查询;
GET /_mget
{
"docs" : [
{
"_index" : "book",
"_type" : "java",
"_id" : 1
},
{
"_index" : "book",
"_type" : "python",
"_id" : 2,
"_source": ["name","author"]
}
]
}
也可以将不同索引不同type的请求放在一个mget中查询,可以通过_source指定想展示的字段;
2.4.5 批量增删改文档:
POST _bulk
{ "create" : { "_index" : "book","_type" : "java", "_id" : "6" } } # 指定创建的index和type,如果不指定id依然是自动生成;
{ "name" : "快学java","author":"大牛","count" : 200 } # 添加的value
{ "create" : { "_index" : "book","_type" : "java"} }
{ "name" : "设计模式","author":"大牛" }
{ "update" : { "_index" : "book","_type" : "java", "_id" : "1" } } # 更新文档
{ "doc" : {"count" : 200} } # 部分更新
{ "delete" : { "_index" : "book","_type" : "java", "_id" : "2" } } # 删除文档
每个子请求都被独立的执行,所以一个子请求的错误并不影响其它请求。如果任何一个请求失败,顶层的 error 标记将被设置为 true
本文介绍Elasticsearch的基础概念,包括其作为搜索引擎的应用场景、核心组件的理解,并详细解析基本操作如索引管理、文档操作等。

2082

被折叠的 条评论
为什么被折叠?



