Elasticsearch教程 — Index APIs

类比MySQL,其主要操作是对表的增删改查,对于ES那么就是对索引的操作(index APIs)以及搜索(Search APIs)。搞清楚这两个知识点基本使用ES就没多大的问题了。当然这两个知识点只是ES的小部分功能,但是最重要。我们就从这两方面开始学起。

索引管理

约定: 指的是:索引名/数据流名/别名。 指的是:索引名

# 创建索引
PUT /<索引名>
{
  # 索引的配置选项,索引设置内容很多,可以参考文档:[索引模型][1]
  # 包括:Index设置、Analysis设置、索引分片分配、映射设置、合并、慢日志等等
  "settings": { 
    "number_of_shards": 1
  },
  "mappings": { # 索引中字段的映射
    "properties": { # 属性
      "field1": { "type": "text" }
    }
  },
  "aliases": { # 索引的别名
  }
}
# 删除一个或多个索引,多个逗号分割,支持通配符
DELETE /<索引名>
# 获取索引,支持通配符
GET /<索引名/数据流/别名>
# 检查数据流、索引或别名是否存在,多个逗号分割,支持通配符
HEAD /<索引名/数据流/别名>
# 关闭索引,多个逗号分割,支持通配符
# 如果有缺失的索引,则会引发错误。可以使用ignore_unavailable=true参数禁用此行为
POST /<索引名>/_close
# 打开一个关闭的索引,多个逗号分割,支持通配符
# 如果有缺失的索引,则会引发错误。可以使用ignore_unavailable=true参数禁用此行为
POST /<索引名>/_open

映射管理

# 更新映射,多个逗号分割,支持通配符
# 如果有缺失的索引,则会引发错误。可以使用ignore_unavailable=true参数禁用此行为
PUT /<索引/数据流/别名>/_mapping
{
  "properties": { # 属性定义
    "email": {"type": "keyword"} # 字段名:字段数据类型
  }
}

# 更新映射 API 可以通过单个请求应用于多个数据流或索引
PUT /<索引1>,<索引2>/_mapping
{
  "properties": { # 属性定义
    "email": {"type": "keyword"} # 字段名:字段数据类型
  }
}

# 添加新属性到现有字段。当然,创建索引的时候也是可以添加多属性字段的
PUT /<索引>/_mapping
{
  "properties": {
    "name": {  # 字段名
      "properties": { # 新属性定义
        "last": {"type": "text"}, # 新字段1,新字段的类型
        "start": {"type": "text"} # 新字段2,新字段的类型
      }
    }
  }
}

# 允许您以不同方式索引同一字段
PUT /<索引/数据流/别名>/_mapping
{
  "properties": {
    "city": {
      "type": "text", # 同一个字段,第一种索引方式
      "fields": { # 同一个字段,第二种索引方式,还可以多加几个索引方式
        "raw": {
          "type": "keyword"
        }
      }
    }
  }
}

# 注意:您无法更改现有字段的映射或字段类型,否则可能会使已编入索引的数据无效。
# 如果你要更改索引映射,比较麻烦,参考文档。如果数据量不大,可以清空后重新索引。
# 获取一个或多个映射信息,多个逗号分割,支持通配符
GET /<target>/_mapping
# 获取一个或多个字段映射信息,多个逗号分割,支持通配符
GET /<target>/_mapping/field/<field>
# 检查映射类型是否存在,多个逗号分割,支持通配符
HEAD /<index>/_mapping/<type>
# 分析索引或数据流的每个字段的磁盘使用情况,多个逗号分割,支持通配符。建议单个索引使用,会显着消耗资源
POST /<target>/_disk_usage

索引设置

# 实时更改动态索引设置,多个逗号分割,支持通配符
PUT /<target>/_settings
{
  "index" : {
    "number_of_replicas" : 2
  }
}
# 重置索引设置
PUT /<target>/_settings
{
  "index" : {
    "refresh_interval" : null # 重置索引设置,需使用null
  }
}
# 返回一个或多个索引的设置信息,多个逗号分给,支持通配符
GET /<target>/_settings
GET /<target>/_settings/<setting>
# text分析
GET /_analyze
{
  "analyzer" : "standard", # 分析器
  "filter" : ["lowercase"], # 词元过滤器,可设置多个,可配置每个过滤器
  "tokenizer" : "keyword", # 分词器,只能设置一个
  "char_filter" : ["html_strip"], # 字符过滤器,可设置多个,可配置每个过滤器
  "text" : "this is a test" # 被分析的文本
}

POST /_analyze

GET /<index>/_analyze

POST /<index>/_analyze

别名设置

注意,在实际项目中,使用别名可以极大的方便我们使用,因为[索引/数据流等]设置的别名是可以在不改变原有索引等情况下随意修改,所以推荐。

这样有什么优点呢?例如:重建索引时,复制一个索引后,拷贝旧索引数据到新索引后,直接修改别名到新索引即可完成重建。跨索引查询时,设置别名,可以在不改变代码时,增减需要的索引。

业务越复杂,使用别名后,就可以在不改变或少量修改代码的情况下修改业务。但在实践中,一般项目中后期才会发现别名的好处。

# 别名是一个非常实用的功能,相当于可以指向多个的快捷方式。
# 重置索引设置
POST _aliases
{
  "actions": [  # (必需,对象数组)要执行的操作
    {
      "add": {  # add、remove、remove_index 操作类型。至少需要一项操作
        "index": "my-data-stream", # index、indices之一必需,属性:值,动作的数据流或索引名
        "alias": "my-alias" # alias、aliases之一必须,动作的别名
      }
    }
  ]
}
# 将数据流或索引添加到别名。
# <alias>(必需,字符串)要更新的别名。如果别名不存在,则会创建它。
# <target>(必需,字符串)要添加的数据流或索引,多个逗号分隔。支持通配符。
POST <target>/_alias/<alias>

POST <target>/_aliases/<alias>

PUT <target>/_alias/<alias>

PUT <target>/_aliases/<alias>
# 获取一个或多个别名信息 
GET _alias/<alias> # 某一个或多个别名

GET _alias # 所有别名

GET <target>/_alias/<alias> # 目标索引或数据流的一个或多个别名
# 删除一个或多个别名
# 响应码  200所有指定的别名都存在,404一个或多个指定的别名不存在
DELETE <target>/_alias/<alias>

DELETE <target>/_aliases/<alias>
# 查看一个或多个别名是否存在
DELETE <target>/_alias/<alias>

DELETE <target>/_aliases/<alias>

索引模板

# 创建或更新索引模板。索引模板定义 了可以自动应用于新索引的设置、映射和别名。
# 对索引模板的更改不会影响现有索引,包括数据流的现有支持索引。
# <index-template>(必需,字符串)要创建的索引模板的名称。
PUT /_index_template/<index-template>

# 例子
PUT /_index_template/template_1
{
  "index_patterns" : ["te*"], # (必需,字符串数组)通配符(*)表达式数组,用于在创建期间匹配数据流和索引的名称。
  "priority" : 1,
  "template": { # (可选,对象)要应用的模板。它可任选地包括一个aliases,mappings或 settings配置。
    "settings" : {
      "number_of_shards" : 2
    }
  }
}
# 获取索引模板,返回有关一个或多个索引模板的信息。
GET /_index_template/<index-template>
# 删除索引模板
DELETE /_index_template/<index-template>
# 创建或更新组件模板。
# 一个索引模板可以由多个组件模板组成。
# <component-template>(必需,字符串)要创建的组件模板的名称。
PUT /_component_template/<component-template>
# 获取组件模板
GET /_component_template/<component-template>
# 删除组件模板
DELETE /_component_template/<component-template>
# 模拟索引
# <index>(必需,字符串)要模拟的索引的名称。
POST /_index_template/_simulate_index/<index>
# 模拟模板
POST /_index_template/_simulate/<index-template>

监控、状态等

# 返回一个或多个索引的统计信息
# <target>(可选,字符串)索引、别名、数据流名称
# <index-metric>(可选,字符串)用于限制请求的以逗号分隔的指标列表。支持的指标有:
# _all,completion,docs,fielddata,fielddata,get,indexing,merge,query_cache,
# refresh,request_cache,search,segments,store,suggest,translog,warmer

GET /<target>/_stats/<index-metric>
GET /<target>/_stats
GET /_stats
# 返回有关 索引分片中Lucene段的低级信息
GET /<target>/_segments
GET /_segments

# 返回有关一个或多个索引的正在进行和已完成的分片恢复的信息
GET /<target>/_recovery
GET /_recovery

# 在一个或多个索引中检索有关副本分片的存储信息
GET /<target>/_shard_stores
GET /_shard_stores
# 清除一个或多个索引的缓存
POST /<target>/_cache/clear
POST /_cache/clear

# 刷新一个或多个搜索索引
# 最原始的ES版本里,必须等待fsync将segment刷入磁盘,才能将segment打开供search使用,这样的话,从一个document写入到它可以被搜索,可能会超过一分钟,主要瓶颈是在fsync实际发生磁盘IO写数据进磁盘,是很耗时的,这就不是近实时的搜索了。为此,引入refresh操作的目的是提高ES的实时性,使添加文档尽可能快的被搜索到,同时又避免频繁fsync带来性能开销
# translog文件就是ES近实时的关键所在,新增的索引的文档数据在buffer内存缓冲区中,以segment文件存在时,是不能被搜索到的;只有translog文件控制segment文件refresh到缓存cache中,才可以被搜索到
POST <target>/_refresh
GET <target>/_refresh
POST /_refresh
GET /_refresh

# es默认每隔30分钟会将filesystem cache中的数据刷入磁盘同时清空translog日志文件,因此此时内存中的segments已经写入到磁盘中,就不需要translog来保障数据安全了,这个过程叫做flush
POST /<target>/_flush
GET /<target>/_flush
POST /_flush
GET /_flush

# 强制合并一个或多个索引的分片
POST /<target>/_forcemerge
POST /_forcemerge

# 如果 Elasticsearch 遇到当前集群状态中不存在的索引数据,则这些索引被认为是悬空的。通常分布式系统中,有节点离线,但这时有删除索引操作时,可能会出现。
# 列出悬空索引
GET / _dangling 

# 导入一个悬空索引
# <index-uuid>(必需,字符串)要导入的索引的 UUID,您可以使用List dangling indices API找到它
POST /_dangling/<index-uuid>?accept_data_loss=true

# 删除悬空索引
DELETE /_dangling/<index-uuid>?accept_data_loss=true

相关文章

此处评论已关闭