文章目录
- 数据类型
- 字符串
- 浮点类型
- 日期类型
- 范围类型
- array类型
- 对象数组
- nested类型
- 查询
- 聚合
- 增删改
- RestAPI
- cat命令
- aliases
- allocation
- count
- health
- indices
- master
- nodeattrs
- nodes
- pending_tasks
- plugins
- recovery
- segments
- shards
- thread_pool
在《
Elastic中index与document基本操作》中介绍了Elastic的基本知识;本节将介绍Elastic中数据类型和常用RestAPI。
数据类型
Elastic的每个document中都可以包含不同的数据类型。
名称 | 具体类型 |
字符串类型 | text,keyword |
整数类型 | integer,long,short,byte |
浮点类型 | double,float,half_float,scaled_float |
逻辑类型 | boolean(接受的值:true, false, “true”, “false”) |
日期类型 | date |
范围类型 | range |
二进制类型 | binary(用base64表示的二进制数据,用于图像等;只存储,不索引) |
数组类型 | array |
对象类型 | object(存储单个JSON对象) |
嵌套类型 | nested(存储多个JSON对象组成的数组) |
地理坐标类型 | geo_point |
地理地图 | geo_shape |
IP类型 | ip |
自动补全建议 | completion |
令牌计数类型 | token_count |
附件类型 | attachment |
抽取类型 | percolator(接受来自 query-dsl 的查询) |
字符串
text类型:当一个字段是要被全文搜索(如Email内容、产品描述)时,应使用text类型。设置text类型以后,字段内容会被分词,生成倒排索引。text类型的字段不用于排序,很少用于聚合。
keyword类型:适用于索引结构化的字段(如email地址、主机名、状态码和标签)。如果字段需要进行过滤、排序、聚合,则使用keyword。keyword类型的字段只能通过精确值搜索到。
需要分词使用text,否则使用keyword。
浮点类型
- double:64位双精度IEEE 754浮点类型
- float:32位单精度IEEE 754浮点类型
- half_float:16位半精度IEEE 754浮点类型
- scaled_float : 缩放类型的的浮点数
对于float、half_float和scaled_floa:-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。
scaled_float:带缩放因子的浮点类型(实际存储的是整数long类型)。比如价格(只需要精确到分)字段缩放因子设为100;对于价格为57.34的记录,存储的就是5734 。优先考虑使用带缩放因子的scaled_float浮点类型。
日期类型
Elasticsearch内部会把日期转换为 UTC (世界标准时间),并将其存储为代表时间毫秒数的长整数。日期格式可以自定义,如果没有指定格式,则使用默认值:
"strict_date_optional_time||epoch_millis"
日期类型表示格式可以:
- 日期格式的字符串:如 “2018-01-13” ,可支持的格式:
- “
yyyy-MM-dd
” - “
yyyyMMdd
” - “
yyyyMMddHHmmss
” - “
yyyy-MM-ddTHH:mm:ss
” - “
yyyy-MM-ddTHH:mm:ss.SSS
” - “
yyyy-MM-ddTHH:mm:ss.SSSZ
”,
- long类型的毫秒数( milliseconds-since-the-epoch,epoch就是指UNIX诞生的UTC时间1970年1月1日0时0分0秒)
- integer的秒数(seconds-since-the-epoch)
date类型在设定时,需要指定type类型,且可通过format设定格式:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"updated_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
范围类型
类型 | 说明 |
| 32 位有符号整数的范围值,-231 ~ 231-1 |
| 62 位有符号整数的范围值,-263 ~ 263-1 |
| 32位单精度浮点数范围值 |
| 64位单精度浮点数范围值 |
| 以64位无符号整数形式表示的日期值范围 |
| IPv4 或 IPv6 的范围值 |
array类型
Elastic中没有专门的数组(Array)数据类型,但是,在默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型,只不过,数组类型的各个元素值的数据类型必须相同:
- 字符数组:[ “one”, “two” ]
- 整数数组:[ 1, 2 ]
- 对象(文档)数组:[ { “name”: “Mike”, “age”: 12 }, { “name”: “John”, “age”: 10 } ]
对象数组
Elastic引擎内部把对象数组展开成扁平的数据结构(文档的内部字段之间的关联被移除);
PUT my_index/my_type/1
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
在内部会被存储为(所有first存储在一起,last存储在一起):
{
"group" : "fans",
"user.first" : [ "alice", "john" ],
"user.last" : [ "smith", "white" ]
}
nested类型
通过对象数组存储多个对象时,对象内的关系会被移除,此时将无法做对象查询。为了解决此问题,需要把字段改为nested类型。
PUT /blog_test
{
"mappings": {
"blog": {
"properties": {
"title": {
"type": "text"
},
"comments": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"comment": {
"type": "text"
},
"age": {
"type": "short"
}
}
}
}
}
}
}
查询
nested查询时,要指定其路径(根据评论人的姓名与年龄查询):
GET /blog_test/_search?pretty
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{
"match": {
"comments.name": "john"
}
},
{
"match": {
"comments.age": 34
}
}
]
}
}
}
}
]
}
}
}
聚合
使用bucket聚合nested(聚合评论者中年龄最小的值):
GET blog_test/_search
{
"size": 0,
"aggs": {
"comm_aggs": {
"nested": {
"path": "comments"
},
"aggs": {
"min_age": {
"min": {
"field": "comments.age"
}
}
}
}
}
}
增删改
以索引2为例:
POST blog_test/blog/2
{
"title": "Hero",
"comments": [
{
"name": "steve",
"age": 24,
"comment": "Nice article.."
}
]
}
POST blog_test/blog/2/_update
{
"script": {
"source": "for(e in ctx._source.comments){if (e.name == 'steve') {e.age = 25; e.comment= 'very very good article...';}}"
}
}
POST blog_test/blog/2/_update
{
"script": {
"lang": "painless",
"source": "ctx._source.comments.removeIf(it -> it.name == 'John');"
}
}
RestAPI
Elastic可通过Http请求方便地执行命令(在kibana的Dev Tool中也可直接执行):
- 查询集群状态:
curl localhost:9200/_cat/health?v
- 查询节点状态:
curl localhost:9200/_cat/nodes?v
- 查询全部索引:
curl localhost:9200/_cat/indices?v
-
curl localhost:9200/_cat/indices/test*?v
:查询以test开始的索引
- 创建索引:
curl -XPUT localhost:9200/{index}/{type}/id -d {//JSON-body}
- 删除索引:
curl -XDELETE localhost:9200/{index}
cat命令
通过_cat
,可查询Elastic系统信息,一些公关参数为(?后查询参数):
- v:显示表头;如
GET _cat/allocation?v
- help:返回参数说明;如
GET _cat/indices?help
- h:选择要显示的列;如
GET _cat/health?v&h=epoch,cluster
- format:设置返回内容格式(支持json,yaml,text,smile,cbor);如
GET _cat/health?format=json
- s:排序;如
GET _cat/indices?v&s=docs.count:desc,store.size:asc
aliases
显示别名、过滤器、路由信息:
GET _cat/aliases?v
名称 | 描述 |
alias: | 别名 |
index: | 索引别名指向 |
filter: | 过滤规则 |
routing.index: | 索引路由 |
routing.search: | 搜索路由 |
allocation
显示每个节点分片数量、占用空间:
GET _cat/allocation?v
名称 | 描述 |
shards: | 节点承载的分片数量 |
disk.indices: | 索引占用的空间大小 |
disk.used: | 节点所在机器已使用的磁盘空间大小 |
disk.avail: | 节点可用空间大小 |
disk.total: | 节点总空间大小 |
disk.percent: | 节点磁盘占用百分比 |
host: | 节点的host地址 |
ip: | 节点的ip地址 |
node: | 节点名称 |
count
显示索引文档数量
GET _cat/count?v
名称 | 描述 |
epoch: | 自标准时间(1970-01-01 00:00:00)以来的秒数 |
timestamp: | 时间 |
count: | 文档总数 |
health
查看集群健康状况
GET _cat/health?v
名称 | 描述 |
epoch: | 自标准时间(1970-01-01 00:00:00)以来的秒数 |
timestamp: | 时间 |
cluster: | 集群名称 |
status: | 集群状态 |
node.total: | 节点总数 |
node.data: | 数据节点总数 |
shards: | 分片总数 |
pri: | 主分片总数 |
repo: | 复制节点的数量 |
init: | 初始化节点的数量 |
unassign: | 未分配分片的数量 |
pending_tasks: | 待定任务数 |
max_task_wait_time: | 等待最长任务的等待时间 |
active_shards_percent: | 活动分片百分比 |
indices
查看索引信息:
GET _cat/indices?v
名称 | 描述 |
health: | 索引的健康状态 |
status: | 索引的开启状态 |
index: | 索引名字 |
uuid: | 索引的uuid |
pri: | 索引的主分片数量 |
rep: | 索引的复制分片数量 |
docs.count: | 索引下的文档总数 |
docs.deleted: | 索引下删除状态的文档数 |
store.size: | 主分片+复制分片的大小 |
pri.store.size: | 主分片的大小 |
master
显示master节点信息
GET _cat/master?v
名称 | 描述 |
id: | 节点ID |
host: | 主机名称 |
ip: | 主机IP |
node: | 节点名称 |
nodeattrs
显示node节点属性
GET _cat/nodeattrs?v
名称 | 描述 |
node: | 节点名称 |
host: | 主机地址 |
ip: | 主机ip |
attr: | 属性描述 |
value: | 属性值 |
nodes
显示node节点信息
GET _cat/nodes?v
名称 | 描述 |
ip: | node节点的IP |
heap.percent: | 堆内存占用百分比 |
ram.percent: | 内存占用百分比 |
cpu: | CPU占用百分比 |
load_1m: | 1分钟的系统负载 |
load_5m: | 5分钟的系统负载 |
load_15m: | 15分钟的系统负载 |
node.role: | node节点的角色 |
master: | 是否是master节点 |
name: | 节点名称 |
pending_tasks
显示正在等待的任务
GET _cat/pending_tasks?v
名称 | 描述 |
insertOrder: | 任务插入顺序 |
timeInQueue: | 任务排队了多长时间 |
priority: | 任务优先级 |
source: | 任务源 |
plugins
显示每个运行插件节点的视图
GET _cat/plugins?v
名称 | 描述 |
name: | 节点名称 |
component: | 插件名称 |
version: | 插件版本 |
recovery
显示正在进行和先前完成的索引碎片恢复的视图
GET _cat/recovery?v
名称 | 描述 |
index: | 索引名称 |
shard: | 分片名称 |
time: | 恢复时间 |
type: | 恢复类型 |
stage: | 恢复阶段 |
source_host: | 源主机 |
source_node: | 源节点名称 |
target_host: | 目标主机 |
target_node: | 目标节点名称 |
repository: | 仓库 |
snapshot: | 快照 |
files: | 要恢复的文件数 |
files_recovered: | 已恢复的文件数 |
files_percent: | 恢复文件百分比 |
files_total: | 文件总数 |
bytes: | 要恢复的字节数 |
bytes_recovered: | 已恢复的字节数 |
bytes_percent: | 恢复字节百分比 |
bytes_total: | 字节总数 |
translog_ops: | 要恢复的translog操作数 |
translog_ops_recovered: | 已恢复的translog操作数 |
translog_ops_percent: | 恢复的translog操作的百分比 |
segments
显示碎片中的分段信息
GET _cat/segments?v
名称 | 描述 |
index: | 索引名称 |
shard: | 分片名称 |
prirep: | 主分片还是副本分片 |
ip: | 所在节点IP |
segment: | segments段名 |
generation: | 分段生成 |
docs.count: | 段中的文档树 |
docs.deleted: | 段中删除的文档数 |
size: | 段大小,以字节为单位 |
size.memory: | 段内存大小,以字节为单位 |
committed: | 段是否已提交 |
searchable: | 段是否可搜索 |
version: | 版本 |
compound: | compound模式 |
shards
显示分片信息
GET _cat/shards?v
名称 | 描述 |
index: | 索引名称 |
shard: | 分片序号 |
prirep: | 分片类型,p表示是主分片,r表示是复制分片 |
state: | 分片状态 |
docs: | 该分片存放的文档数量 |
store: | 该分片占用的存储空间大小 |
ip: | 该分片所在的服务器ip |
node: | 该分片所在的节点名称 |
thread_pool
查看线程池信息
GET _cat/thread_pool?v
名称 | 描述 |
node_name: | 节点名称 |
name: | 线程池名称 |
active: | 活跃线程数量 |
queue: | 当前队列中的任务数 |
rejected: | 被拒绝的任务数 |