文章目录

  • 数据类型
  • 字符串
  • 浮点类型
  • 日期类型
  • 范围类型
  • 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"
        }
      }
    }
  }
}

范围类型

类型

说明

integer_range

32 位有符号整数的范围值,-231 ~ 231-1

long_range

62 位有符号整数的范围值,-263 ~ 263-1

float_range

32位单精度浮点数范围值

double_range

64位单精度浮点数范围值

date_range

以64位无符号整数形式表示的日期值范围

ip_range

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:

被拒绝的任务数