ES的数据结构
我们常用的几个类型也就是这几种 text、keyword、byte、short、integer、long、float、double、boolean、date
,其中text和keyword都是string类型,选择区分很简单,需要进行分词用text,不需要并且进行排序或聚合的可以用keyword。
创建索引库
PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}
PUT employee_zcy
{
"settings": {
"number_of_shards": 6,
"number_of_replicas": 1,
"refresh_interval": "1s"
},
"mappings": {
"properties": {
"uid": {
"type": "long"
},
"phone": {
"type": "long"
},
"message": {
"type": "keyword"
},
"msgcode": {
"type": "long"
},
"saymessage":{
"type": "text"
},
"sendtime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
查看索引信息
GET employee_zcy
{
"employee_zcy" : {
"aliases" : { },
"mappings" : {
"properties" : {
"message" : {
"type" : "keyword"
},
"msgcode" : {
"type" : "long"
},
"phone" : {
"type" : "long"
},
"saymessage" : {
"type" : "text"
},
"sendtime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"uid" : {
"type" : "long"
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"refresh_interval" : "1s",
"number_of_shards" : "6",
"provided_name" : "employee_zcy",
"creation_date" : "1644299286987",
"number_of_replicas" : "1",
"uuid" : "KGBbvVAPSyerW-BYe9VDdA",
"version" : {
"created" : "7170099"
}
}
}
}
}
- number_of_shards: 是设置的分片数,设置之后无法更改!
- refresh_interval: 是设置es缓存的刷新时间,如果写入较为频繁,但是查询对实时性要求不那么高的话,可以设置高一些来提升性能。可以更改
- number_of_replicas : 是设置该索引库的副本数,建议设置为1以上。
查询一次查询多个索引
GET project_d*
返回 project_d开头的索引的信息
修改索引副本 增加或减少
都可以的
添加:_settings
PUT /my_temp_index/_settings
{
"number_of_replicas": 1
}
修改索引分片 增加或减少
不可以, 索引一旦创建后,不可以修改
如何向已有类型(表)中添加新字段?
PUT projecy_zcy/_mapping
{
"properties":{
"projectStatus":{
"type":"keyword"
}
}
}
如何更改现有类型(表)中的字段类型?
不可以修改
可以对该字段增加类型
原来是
projectName":{
"type":"text"
可以增加"fields":{
"keyword":{
是可以的
PUT projecy_zcy/_mapping
{
"properties":{
"projectName":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
}
}
}
索引别名
有时候,需要将已有的索引做些调整重建为另外一个索引,但是为了不影响线上的访问,需要无缝切换到新的索引上
这里选择通过 alias 来切换索引,因为 alias 中的多条命令是原子性。
POST _aliases
{
"actions": [
{
"add": {
"index": "projecy_zcy2",
"alias": "projecy_zcy"
}
},
{
"remove_index": {
"index": "projecy_zcy"
}
}
]
}
actions 中的多条命令是原子性的,所以可以做到无缝切换,不必担心切换过程中会存在访问不到 projecy_zcy2 时候
actions 中第一条命令:add 命令,给索引 projecy_zcy2 添加了一个别名 projecy_zcy。
actions 中第二条命令:remove_index, 删除原来的 projecy_zcy 索引。
执行之后,原来的 projecy_zcy 索引会被删除,而对于访问方而言,访问的索引依然是 projecy_zcy,不过访问的是一个别名,底层实际访问的索引已经是 projecy_zcy2了
GET projecy_zcy*
重建索引
elasticsearch索引一旦建立,就无法动态修改其字段的映射类型,有时候因为人为原因污染了索引的mapping,这个时候就只能通过重建索引来修改索引的mapping设置了。
当初索引中字段类型不正确,需要调整,由于字段无法修改类型, 可以通过2种方式
第一种方案,给这个索引追加一个新的字段,同时给这个字段指定类型。冗余一个字段
第二种方案:使用 elasticsearch 提供的 reindex api 来迁移数据,创建新的索引。
首先创建好目标索引,并设置好mapping,之后,使用 reindex 将原来的索引重建到新的索引上:
POST _reindex
{
"source": {
"index": "projecy_zcy"
},
"dest": {
"index": "projecy_zcy2"
}
}
等待 reindex 完成后, projecy_zcy2 就结构就就是你想要的mapping了。
删除索引
DELETE my_index
删除多个
delete my_index*