【ES】2.Elastic操作

索引操作

创建索引 文档

  • 基本语法 PUT twitter

  • 索引名称限制:

  • 只能小写

  • 不能包括 \, /, *, ?, ", <, >, |, 空格 , ,, #

  • 不能包括冒号,7.0之前可以用,7.0之后不可以

  • 不能使用 + - 开头

  • 不能包括 . 或者 ..

  • 不能超过 255 个字节

PUT heshen_test_v1
{
  
  "settings": {
    "index":{
      "number_of_replicas": 2, //副本数2
      "number_of_shards": 3,//分片3
      "max_result_window": 1000000, //最大返回数据 1000000
      "write" : {
          "wait_for_active_shards" : "2" //等待多少分片执行完成
        }
    }
  },
  "mappings": { //映射字段
    "_doc":{ // 约定都使用_doc ,可以不实用_doc,但是不能使用_开头,
        "properties":{
           "itemName":{
              "type" : "text"
           },
           "weight":{
              "type" : "scaled_float",
              "scaling_factor": 100
           },
           "price":{
              "type" : "long"
           }
        }
    }
  },
  "aliases": {//别名,用处很多
    "heshen_test": {}
  },
  
}

获取索引

  • GET heshen_test 获取指定索引信息
  • GET * 获取所有的索引信息
  • GET _all 获取所有的索引信息
  • GET es_erp_purchase_* 获取通配符匹配的索引信息

删除索引

  • DELETE heshen_test_v1
  • 删除索引必须是索引名,不能通过别名删除索引

是否存在

  • HEAD heshen_test 索引是否存在

打开/关闭索引

  • POST heshen_test_v1/_close
  • POST heshen_test_v1/_open
  • 被关闭的索引禁止读写,只能展示元信息

索引统计

  • GET``/``_stats
  • GET /heshen_test_v1/_stats

索引别名

文档

创建修改别名

  • 带有过滤器的别名提供了创建相同索引的不同“视图”的简单方法。过滤器可以使用查询DSL定义,并应用于所有搜索、计数、按查询删除以及类似于此别名的操作。
  • 在创建别名时可以指定路由值。
  • 如果一个别名只映射了一个真实索引,则可以使用别名进行index api(即索引文档,写文档),但如果一个别名同一时间映射了多个索引,默认是不能直接使用别名进行索引文档,因为ES不知道文档该发往哪个索引。可以使用is_write_index属性为一个别名下的其中一个索引指定为写索引,此时则可以直接使用别名进行index api的调用。
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "heshen_test_v1",
        "alias": "heshen",
        "is_write_index": true,
        "routing": "1",
        "filter": {
          "term": {
            "remarks": "测试"
          }
        }
      }
    },
    {
      "add": {
        "index": "heshen_test_v2",
        "alias": "heshen"
      }
    }
  ]
}

删除别名

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "heshen_test_v2",
        "alias": "heshen"
      }
    },
    {
      "remove": {
        "index": "heshen_test_v1",
        "alias": "heshen"
      }
    }
  ]
}

Reindex

文档

  • es的索引一旦创建,分片,以及字段类型都不允许修改,所以一般只能创建新的索引,然后把数据导入
  • reindex支持把数据从一个索引拷贝到另一个索引中
  • reindex不会复制索引的设置,包括mapping ,settings

普通复制

POST _reindex
{
  "source": {
    "index": "heshen_test_v1"
  },
  "dest": {
    "index": "heshen_test_v2"
  }
}

其他参数

  • 在dest中 添加 version_type (见下文类型介绍 ) 字段可以实现根据版本进行复制
  • 默认情况下,version冲突会终止reindex进程,可以通过 conflicts 属性来设置不结束,只统计冲突数量
  • 在dest中 op_type 可以设置操作类型,可以设置只复制不存在的数据
  • 可以通过 query属性来设置那些数据被复制
  • source的index 可以是一个列表 ,来将多个索引的数据复制到一个索引
  • source的 _source 可以设置只复制部分字段
  • 可以用过 script 来修改文档
POST _reindex
{
  "size": 12,//只处理12条数据
  "conflicts": "proceed",//冲突计数
  "source": {
    "index": "heshen_test_v1", //也可以是  "index":[ "heshen_test_v1"," "heshen_test_v3"]
    "query": { //设置源数据那些数据需要复制
      "term": {
        "weight": {
          "value": 12
        }
      }
    },
   "_source": ["weight", "itemName"],//只复制部分字段
   "sort": { "date": "desc" },//设置处理数据排序
   "script": {
      "inline": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",
      "lang": "painless"
   }
  },
  "dest": {
    "index": "heshen_test_v2",
    "version_type": "external", //版本复制
    "op_type":"create" //只会创建不存在的数据
  }
}

索引模板

索引模板是什么

  • 索引模板是可以在创建一个新的索引的时候,自动应用的模板,包括设置和映射。
  • 模板只在创建索引的时候使用,更改模板不会对现有索引产生影响
  • 在创建的时候,自定义的设置,映射优先于 模板当中的。

创建索引模板

PUT _template/template_heshen
{
  "index_patterns": [//匹配模式
    "heshen*"
  ],
  "order" : 0,//优先级
  "settings": {//预定的设置
    "index": {
      "number_of_replicas": 2,
      "number_of_shards": 3,
      "max_result_window": 1000000
    }
  },
  "mappings": {//预定的mappings
    "_doc": {
        "properties": {
          "created_name": {
            "type": "keyword"
          }
        }
      
    },
    "version": 123
  }
}

删除索引模板

  • DELETE``/``_template/template_heshen

获取索引模板

  • GET /_template/template_heshen

模板是否存在

  • HEAD /_template/template_heshen

模板匹配

  • 多个模板可以匹配一个索引,多个相同的配置根据order字段来确定使用那个

Mapping操作

更新Mapping

  • 映射已经创建后,一般不可以更改,除了更改子对象的字段,或者 ignore_above 属性
  • 可以新增一个字段映射
PUT heshen_test_v1/_mapping/_doc
{
  "properties":{
     "img":{
       "type":"keyword"
     }
  }
}
  • 也可以批量添加字段映射
PUT /twitter-1,twitter-2/_mapping/_doc 
{
  "properties": {
    "user_name": {
      "type": "text"
    }
  }
}

获取Mapping

  • GET /heshen_test_v1/_mapping 获取整个Mapping信息
  • GET /heshen_test_v1/_mapping/_doc
  • GET /heshen_test_v1/_mapping/field/img 获取某个字段的映射

Settings操作

更新Settings 文档

  • 注意分片数不可以修改
PUT /heshen_test_v1/_settings
{
    "index" : {
        "number_of_replicas" : 1
    }
}

获取Settings

  • GET heshen_test_v1/_settings

文档 Document

插入

指定id插入,如果存在则是更新

PUT heshen_test_v1/_doc/2
{
  "itemName": "C货2",
  "weight": 12,
  "price":20
}

es自动生成id (使用post代替put)

POST heshen_test_v1/_doc/2
{...}

指定操作类型,指定类型为创建,如果id已经存在,就会返回失败

PUT heshen_test_v1/_doc/4/_create
{...}

PUT heshen_test_v1/_doc/4?op_type=create
{...}

超时时间

PUT heshen_test_v1/_doc/4?timeout=10ms
{...}

版本号-乐观锁更新

  • 默认es采用内部版本控制,每一次更新版本号+1,我们可以使用version_type=external 来启用外部版本号功能。
  • 请求的版本号需要是非负正整数
  • 默认es的内部版本控制为一定要与当前版本号相同才能更新成功
  • (启用之后,之后好像就不用在每次带version_type)
PUT heshen_test_v1/_doc/2?version=17
{...}
当文档version=17的时候保存成功

PUT heshen_test_v1/_doc/2?version=17&version_type=external_gte
{...}
当文档version<=17的时候成功

PUT heshen_test_v1/_doc/2?version=17&version_type=external
{...}
当文档version<17的时候成功

version_type类型

internal :完全相同才成功

external_gt || external :当请求的版本号大于的时候才成功

external_gte :当请求的版本号大于等于的时候才成功

自动创建索引。

如果索引不存在,自动创建索引,并且应用索引模板,字段类型es会动态生成。可以通过action.auto_create_index 来控制。

PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "heshen*"//只允许某些索引创建 
    }
}

PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "false" //全部不允许
    }
}

PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "true" //全部允许
    }
}

更新

基于id部分字段更新

  • 存在的字段会被更新
  • 不存在的字段会添加,映射不存在的会自动添加映射
POST heshen_test_v1/_doc/1/_update
{
   "doc": {
     "itemName":"C货112"
   }
}

基于脚本更新

  • 基于es的script脚本进行更新
POST heshen_test_v1/_doc/1/_update
{
  "script": {
     "source":"ctx._source.remarks='和天下'"
  }
}

POST heshen_test_v1/_doc/1/_update
{
  "script": {
    "source": "ctx._source.weight=params.count",
    "lang": "painless",
    "params": {
      "count": 4
    }
  }
}

Upsert

  • 普通更新如果文档不存在,会报错
  • 而加了upsert之后,如果文档不存在,会初始化文档
POST heshen_test_v1/_doc/6/_update
{
  "script": {
    "source": "ctx._source.weight=params.count",
    "lang": "painless",
    "params": {
      "count": 4
    }
  },
  "upsert": {
    "itemName": "C货2",
    "weight": 12,
    "price": 20
  }
}

更新基于条件

POST heshen_test_v1/_update_by_query
{
    "script": {
    "source": "ctx._source.remarks=ctx._source.remarks+'*'",
    "lang": "painless"
  },
  "query": {
    "terms": {
      "_id": [
        "1"
      ]
    }
  }
}

如何使用脚本

链接

脚本构成

  "script": {
    "lang":   "...",  //脚本使用的语言 默认为 painless 
    "source" | "id": "...", // 
    "params": { ... } //参数
  }

搜索返回字段

  • es在第一次执行脚本的时候会把他缓存起来,所以如果脚本里有参数的话,一般是要使用参数字段,而不是硬编码
GET heshen_test_v1/_search
{
  "script_fields": {
    "weight_big": {
      "script": {
        "lang":   "expression",
        "source":"doc['weight'] * sp",
        "params": {
           "sp": 100
        }
      }
    }
  }
}

操作数据

  • 在reindex 和 update_by_query 可以设置数据的属性,甚至删除数据


noop: 设置 ctx.op = “noop” 。如果你的脚本并没有对原来的doc做任何更改。这将导致 reindex 忽略该doc。这将在响应的 noop 中被展示。

delete: 设置ctx.op = “delete”,如果你的脚本如此设定,target index中的该doc会被被删除。这将在响应的 deleted 中被展示。


删除

基于id进行删除

DELETE heshen_test_v1/_doc/1

基于条件删除

POST heshen_test_v1/_delete_by_query
{
  "query": {
    "terms": {
      "_id": [
        "1"
      ]
    }
  }
}

Bulk 批量增删改

  • bulk是es提供的一种批量增删改

语法

除delete操作意外,所有的操作必须是一对JSON ,而且每个JSON不能换行相邻JSON必须换行

  • 格式:

POST _bulk

{ action: { metadata }}

{ request body }

{ action: { metadata }}

{ request body }

操作类型

  • create 如果文档不存在就创建,但如果文档存在就返回错误
  • index 如果文档不存在就创建,如果文档存在就更新
  • update 更新一个文档,如果文档不存在就返回错误
  • delete 删除一个文档,如果要删除的文档id不存在,就返回错误

示例

POST _bulk
{"index":{"_index":"heshen_test_v1","_type":"_doc","_id":"4"}}
{"_doc":{"itemName":"C货3","weight":12,"price":20}}

POST heshen_test_v1/_doc/_bulk 
{"delete": {"_id": 5}}

ps:在es的bulk操作中,可以把索引,type加在操作前面,这样在json中可以不写出 index ,type

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容