1 ES的结构
1.1 索引Index,分片和备份
索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库。事实上,我们的数据被存储和索引在分片(shards)中,索引只是一个,把一个或多个分片分组在一起的逻辑空间。然而,这只是一些内部细节——我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可(索引的名字必须是全部小写,不能以下划线开头,不能包含逗号)
ES的服务中,可以创建多个索引。
每一个索引默认被分成5片存储。
每一个分片都会存在至少一个备份分片。
备份分片默认不会帮助检索数据,当ES检索压力特别大的时候,备份分片才会帮助检索数据。
备份的分片必须放在不同的服务器中(不要把所有的鸡蛋都放在同一个篮子的道理)。
| 索引分片备份 |
|---|
1.2 类型 Type
类型用于区分同一个索引下不同的数据类型,相当于关系型数据库中的表。在Elasticsearch中,我们使用相同类型(type)的文档表示相同的“事物”,因为他们的数据结构也是相同的。每个类型(type)都有自己的映射(mapping)或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引。
es 6.0 开始不推荐一个index下多个type的模式,并且会在 7.0 中完全移除。在 6.0 的index下是无法创建多个type的
Ps:根据版本不同,类型的创建也不同。
| 类型 |
|---|
1.3 文档 Doc
文档是ElasticSearch中存储的实体,类比关系型数据库,每个文档相当于数据库表中的一行数据。 在Elasticsearch中,文档(document)这个术语有着特殊含义。它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。
一个类型下,可以有多个文档。这个文档就类似于MySQL表中的多行数据。
| 文档 |
|---|
1.4 属性 Field
一个文档中,可以包含多个属性。类似于MySQL表中的一行数据存在多个列。
| 属性 |
|---|
2 操作ES的RESTful语法
GET请求:
http://ip:port/index:查询索引信息
http://ip:port/index/type/doc_id:查询指定的文档信息
POST请求:
http://ip:port/index/type/_search:搜索文档,可以在请求体中提交json字符串来代表查询条件
http://ip:port/index/type/doc_id/_update:更新文档,请求体中提交json字符串代表修改的具体信息
PUT请求:
http://ip:port/index:放置或者说创建一个索引,需要在请求体中指定索引的信息,类型,结构
http://ip:port/index/type/_mappings:放置或者说创建索引时,指定索引文档存储的属性的信息
DELETE请求:
http://ip:port/index:删除索引
http://ip:port/index/type/doc_id:删除对应id的文档
RESTful_百度百科
3 索引的操作
3.1 创建一个索引
语法如下
# 创建一个索引
PUT /person
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
3.2 查看索引信息
语法如下
# 查看索引信息 GET /person
health:健康的情况,正常的情况下es健康状态是绿色。 status:状态 Primaries:分片数量 Replicas:备份数量 Docs count:文档数量
这里新建的索引健康状态是黄色是因为es默认会把备份的分片放到其他服务器上面,但是目前我们是单机版找不到其他的es服务器所以是黄色而已。
3.3 删除索引
语法如下
# 删除索引 DELETE /person
4 ES中Field可以指定的类型
字符串类型:
text:一般被用于全文检索,将当前Field进行分词。
keyword:搜索关键字,当前Field不会被分词。
数值类型:
long:取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次方-1),占用8个字节
integer:取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节
short:取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节
byte:取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节
double:1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节
float:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节
half_float:精度比float小一半。
scaled_float:根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45
时间类型:
date类型,针对时间类型指定具体的格式
布尔类型:
boolean类型,表达true和false
二进制类型:
binary类型暂时支持base64 encode string
范围类型:
long_range:赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,lt,gte,lte
integer_range:同上
double_range:同上
float_range:同上
date_range:同上
ip_range:同上
经纬度类型:
geo_point:用来存储经纬度的
ip类型:
ip:可以存储IPV4或者IPV6
其他的数据类型参考官网:Field datatypes | Elasticsearch Guide [6.5] | Elastic
5 创建索引并指定(settings,mappings),搞结构
语法如下
# 创建索引,指定数据结构
PUT /book
{
"settings": {
# 分片数
"number_of_shards": 5,
# 备份数
"number_of_replicas": 1
},
# 指定数据结构
"mappings": {
# 类型 Type
"novel": {
# 文档存储的Field
"properties": {
# Field属性名
"name": {
# 类型
"type": "text",
# 指定分词器
"analyzer": "ik_max_word",
# 指定当前Field可以被作为查询的条件
"index": true ,
# 是否需要额外存储,一般不需要,可以通过其他关键字比如_source查出来
"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"
}
}
}
}
}
6 文档的操作
文档是ES服务中的唯一标识,_index,_type,_id三个内容为组合,锁定一个文档,如果不存在就添加,否则就是修改。
6.1 新建文档
自动生成_id,在路径/下不写id,es给你自动生成,写了比如/1就用你指定的id1,很容易理解↓
# 添加文档,自动生成id
POST /book/novel
{
"name": "盘龙",
"author": "我吃西红柿",
"count": 100000,
"on-sale": "2000-01-01",
"descr": "山重水复疑无路,柳暗花明又一村"
}
手动指定_id
# 添加文档,手动指定id
PUT /book/novel/1
{
"name": "红楼梦",
"author": "曹雪芹",
"count": 10000000,
"on-sale": "1985-01-01",
"descr": "一个是阆苑仙葩,一个是美玉无瑕"
}
6.2 修改文档
覆盖式修改,覆盖所有
# 添加文档,手动指定id,除了添加,第二次就是就是覆盖式修改
PUT /book/novel/1
{
"name": "红楼梦",
"author": "曹雪芹",
"count": 4353453,
"on-sale": "1985-01-01",
"descr": "一个是阆苑仙葩,一个是美玉无瑕"
}
doc修改方式,修改某个
# 修改文档,基于doc方式
POST /book/novel/1/_update
{
"doc": {
"count": "1234565"
}
}
6.3 删除文档
根据id删除
# 根据id删除文档,下面这个au1kkHoB7Xrpe4LJZRou是之前不指定自动生成的id,如果是手动指定的比如1,就写1 DELETE /book/novel/I8iXnnoB3j5F3DdMxsYB
6.4 查询文档
比如查询id为2的文档数据↓
GET /book/novel/2



