(0.11)elasticsearch常用查询,REST API的基本约定,ES增删查改

【0】小技巧选项

(0.0)常用基本参数(v,help,bates,header)

  1. verbose: 显示列名, 请求参数为v

    示例: curl localhost:9200/_cat/master?v

  2. help: 显示当前命令的各列含义, 请求参数为help. 某些命令部分列默认不显示,可通过help该命令可显示的所有列

    示例: curl localhost:9200/_cat/master?help

  3. bytes: 数值列还原为原始值. 如diskSize, 默认转为以kb/mb/gb表示, 打开后还原为原始值

    示例: curl localhost:9200/_cat/indices?bytes=b

  4. header: 显示指定列的信息, 请求参数为h

    示例: curl localhost:9200/_cat/indices?h=i,tm(显示集群各索引的内存使用)

演示:

1. verbose

每个命令都支持使用?v参数,来显示详细的信息:

curl 172.16.221.104:9400/_cat/master?v
id                       host           ip             node
xO8UJK_dQTKvv1wgpYQIKg   *.*.221.12     *.*.221.12     node1

2.help
每个命令都支持使用help参数,来输出可以显示的列:

curl 172.16.221.104:9400/_cat/master?help
id   |   | node id    
host | h | host name  
ip   |   | ip address 
node | n | node name

3.bytes
很多的命令都支持返回可读性的大小数字,比如使用mb或者kb来表示。

curl 172.16.221.104:9400/_cat/indices?bytes=kb
health status index                  uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana                QTYWgFweRJm2RohdZQKLRw   1   1         41            1    140.3kb        140.3kb
......

4.headers
通过h参数,可以指定输出的字段:

curl 172.16.221.104:9400/_cat/master?v
id                     host           ip             node
xO8UJK_dQTKvv1wgpYQIKg *.*.221.12     *.*.221.12     node1

curl 172.16.221.104:9400/_cat/master?h=ip,node
*.*.221.12      node1

参考:https://www.bookstack.cn/read/elasticsearch-7.9-en/a397f9b7db759452.md#b58esa

(0.1)结果格式:?pretty=true、?format=yaml

  到发出的任何请求时,返回的JSON将采用漂亮的格式(仅用于调试!)。另一个选项是设置?format=yaml,这将导致结果以(有时)更具可读性的Yaml格式返回。

(0.2)结果单位:?human=Ture

  以适合于人类(例如"exists_time": "1h""size": "1kb")和适合计算机(例如"exists_time_in_millis": 3600000"size_in_bytes": 1024的格式返回统计信息

  可以通过添加?human=false到查询字符串来关闭人类可读的值当统计结果被监视工具消耗而不是供人类消耗时,这是有道理的。human标志的默认值为false

(0.3)日期运算:now-1h

 

它接受一个格式化的日期值大多数参数-比如gtltrange查询,或fromtodaterange聚集 -了解最新的数学。

 

表达式以锚定日期开头,可以是,也可以是以now结尾的日期字符串||这个锚定日期可以有选择地跟随一个或多个数学表达式:

 

  • +1h:增加一小时
  • -1d:减去一日
  • /d:四舍五入到最近的一天

 

持续时间内,支持的时间单位不同于时间单位支持的时间单位支持的单位是:

 

y

M

月数

w

周数

d

h

小时

H

小时

m

分钟

s

 

假设now2001-01-01 12:00:00,则一些示例为:

 

now+1h

now以毫秒为单位,再加上一个小时。解析为:2001-01-01 13:00:00

now-1h

now以毫秒减去一小时为单位。解析为:2001-01-01 11:00:00

now-1h/d

now以毫秒减去一小时为单位,四舍五入为UTC 00:00。解析为:2001-01-01 00:00:00

2001.02.01||+1M/d

2001-02-01以毫秒为单位,再加上一个月。解析为:2001-03-01 00:00:00

 

(0.4)内容过滤:?filter_path=..

所有REST API都接受一个filter_path参数,参数可用于减少Elasticsearch返回的响应。

此参数采用逗号分隔的过滤器列表,并用点符号表示:

 

GET /_search?q=kimchy&filter_path=took,hits.hits._id,hits.hits._score

 

结果:

{
  "took" : 3,
  "hits" : {
    "hits" : [
      {
        "_id" : "0",
        "_score" : 1.6375021
      }
    ]
  }
}

它还支持*通配符以匹配任何字段或字段名称的一部分:

GET /_cluster/state?filter_path=metadata.indices.*.stat*

结果:

{
  "metadata" : {
    "indices" : {
      "my-index-000001": {"state": "open"}
    }
  }
}

并且 **通配符可用于包括字段,不知道现场的确切路径。

例如,我们可以使用以下请求返回每个段的Lucene版本:

GET /_cluster/state?filter_path=routing_table.indices.**.state

{
  "routing_table": {
    "indices": {
      "my-index-000001": {
        "shards": {
          "0": [{"state": "STARTED"}, {"state": "UNASSIGNED"}]
        }
      }
    }
  }
}

也可以通过为过滤器添加char前缀来排除一个或多个字段 _

GET /_count?filter_path=-_shards

{
  "count" : 5
}

 

如何多个参数一起用:curl localhost:9200/_cat/master?v&pretty

【增删改查】  

  

(1)增加 index/create:PUT/POST

index操作:就是直接覆盖(覆盖即:删除后新增)

create操作:就是新增,如果要新增的已经存在,则报错

// index:存在则覆盖,不存在则创建
PUT users/_create/1
{
  "user":"张三",
  "age":28,
  "message":"he is a dba"
}

// create:create document 指定id,如果已经存在,就报错; 且若需要指定id,则必须要用 PUT
//(文档存在则报错,不存在则新建)
PUT users/_create/1
{
  "user":"张三",
  "age":28,
  "message":"he is a dba"
}

// create:create document 自动生成_id,必须用 POST,_doc后面才能不指定 id
//(索引存在则自动生成新_id,不存在则新建索引=》然后自动生成新的_id)
POST users/_doc
{
  "user":"张三",
  "age":28,
  "message":"he is a dba"
}

// create:create document 指定ID,如果ID存在则报错
// 文档存在则报错,不存在则新建;同时索引如果不存在也会新建
POST users/_doc/1?op_type=create
{
  "user":"张三",
  "age":28,
  "message":"he is a dba"
}

(2)update:POST

POST 直接修改,_version 可以

  

// create/replace document 不存在则新建,存在则覆盖(删除原有创建新的,_version+1)
PUT users/_doc/1
{
  
  "user":"tom"
}

GET users/_doc/1
  
// 在原文档上增加字段
POST users/_update/1/
{
  "doc": {
    "age":1,
    "messages":"hello world"
  }
}
GET users/_doc/1
  

(3)批量操作:_bulk 

每一次 增删改以及index操作,都会返回结果集

POST _bulk
{ "index":{"_index":"test","_id":"1"} }
{ "field1":"value1" }
{ "delete":{"_index":"test","_id":"2"} }
{ "create":{"_index":"test2","_id":"3"} }
{ "field1":"value3" }
{ "update":{"_id":"1","_index":"test"} }
{ "doc":{"field2":"value2"} }

(4)查询:GET/_mget/_msearch

GET users/_doc/1 --基本查询文档
GET users,users1 --查询多个索引

批量查询:MGET

     

    

 

 _msearch:

  

 

 

 

 

 

 

 

 

【1】多个资源请求

(1.1)基本查多个索引

您可以使用逗号分隔的列表对多个资源

test1,test2,test3 

(1.2)通配符,like 之类的模糊查询

还可以使用通配符 * ,如:

  test*或*test或te*t或*test*。

  您可以使用以下-字符排除目标:test*,-test3。

(1.3)别名引起的问题

索引别名在通配符表达式之后解析。这可能会导致针对排除的别名的请求。

  例如,如果test3是索引 abc 的别名,则该模式test*,-test3仍将定位到的索引test3

  为了避免这种情况,请排除别名的具体索引。如:test*,-abc

(1.4)多目标API的字符串参数

ignore_unavailable :(可选,布尔值)如果为true,则响应中不包含缺少或闭合的索引。默认为false

allow_no_indices:(可选,布尔值)如果true,请求并如果通配符表达式或者返回一个错误_all值仅检索丢失或封闭的索引。此参数还适用于指向别名缺失或封闭索引的索引别名

expand_wildcards:(可选,字符串)控制通配符表达式可以扩展到的索引类型。如用逗号分隔,可以接受多个值open,hidden。有效值为:

all:展开以打开和关闭索引,包括隐藏索引。
open:仅展开以打开索引。
closed:仅扩展到封闭索引。
hidden:通配符的扩展将包括隐藏的索引。必须与之合并open,closed或两者兼而有之。
none:不接受通配符表达式。

 ignore_throttled :(可选,布尔值)如果为true,冻结时将忽略具体的索引,扩展的索引或别名索引。默认为true

【2】索引名称中对日期的数学支持

(2.1)作用

日期数学索引名称解析使您可以搜索一系列时间序列索引,而不必搜索所有时间序列索引并过滤结果或维护别名。

限制搜索索引的数量可以减少群集上的负载并提高执行性能。

例如,如果您要在日常日志中搜索错误,则可以使用日期数学名称模板将搜索范围限制为过去两天。

 

几乎所有具有index参数的API都index参数值中支持日期数学

日期数学索引名称采用以下形式:

<static_name{date_math_expr{date_format|time_zone}}>

参数释义:

static_name

是名称的静态文本部分

date_math_expr

是动态日期数学表达式,可动态计算日期

date_format

是一种可选格式,应以这种格式呈现计算出的日期。默认为yyyy.MM.dd格式应与Java时间https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html兼容

time_zone

是可选的时区。默认为utc

请注意空格中小写与大写字母的用法date_format

例如:mm表示小时,而MM表示月份

类似地,结合表示范围内hh的小时,而表示24小时范围内的小时。1-12AM/PMHH0-23

日期数学表达式与语言环境无关。因此,除了公历以外,无法使用其他日历。

 

您必须将日期数学索引名称表达式括在尖括号内,并且所有特殊字符均应进行URI编码。例如:

# PUT /<my-index-{now/d}>
PUT /%3Cmy-index-%7Bnow%2Fd%7D%3E

 

(2.2)日期数学字符的百分比编码

用于日期舍入的特殊字符必须使用URI编码,如下所示

  

<

%3C

>

%3E

/

%2F

{

%7B

}

%7D

|

%7C

+

%2B

:

%3A

,

%2C

 

 

以下示例显示了不同形式的日期数学索引名称,以及在当前时间为2024年3月22日正午utc时,它们解析为的最终索引名称。

表达解析为

<logstash-{now/d}>

logstash-2024.03.22

<logstash-{now/M}>

logstash-2024.03.01

<logstash-{now/M{yyyy.MM}}>

logstash-2024.03

<logstash-{now/M-1M{yyyy.MM}}>

logstash-2024.02

<logstash-{now/d{yyyy.MM.dd|+12:00}}>

logstash-2024.03.23

要使用字符{ and 在索引名称模板的静态部分中,请使用反斜杠对其进行转义\,例如:

<elastic\{ON\}-{now/M}> 解析为 elastic{ON}-2024.03.01

(2.3)案例

以下示例显示了一个搜索请求,该搜索请求在过去三天中搜索Logstash索引,假设索引使用默认的Logstash索引名称格式logstash-yyyy.MM.dd

# GET /<logstash-{now/d-2d}>,<logstash-{now/d-1d}>,<logstash-{now/d}>/_search
GET /%3Clogstash-%7Bnow%2Fd-2d%7D%3E%2C%3Clogstash-%7Bnow%2Fd-1d%7D%3E%2C%3Clogstash-%7Bnow%2Fd%7D%3E/_search
{
  "query" : {
    "match": {
      "test": "data"
    }
  }
}

【3】cron 定时任务 表达式 

(3.1)作用、一般形式

其实就和linux的 cron 一样

cron表达式是以下形式的字符串:

  <seconds> <minutes> <hours> <day_of_month> <month> <day_of_week> [year]

Elasticsearch使用Quartz Job Scheduler中的cron解析器有关编写Quartz cron表达式的更多信息,请参见Quartz CronTrigger教程

所有计划时间均以协调世界时(UTC)为准;不支持其他时区。

您可以使用elasticsearch-croneval命令行工具来验证您的cron表达式。

(3.2)Cron表达式的元素

除以外,所有元素都是必需的year有关允许的特殊字符的信息,请参见Cron特殊字符。

<seconds>

(必填)有效值:0-59和特殊字符, - * /

<minutes>

(必填)有效值:0-59和特殊字符, - * /

<hours>

(必填)有效值:0-23和特殊字符, - * /

<day_of_month>

(必填)有效值:1-31和特殊字符, - * / ? L W

<month>

(必需)有效值:112JANDECjan-dec和特殊字符, - * /

<day_of_week>

(必需)有效值:17SUNSATsun-sat和特殊字符, - * / ? L #

<year>

(可选)有效值:1970-2099和特殊字符, - * /

(3.3)Cron特殊字符(*_?,/LW)

*

选择一个字段的每个可能的值。例如,*在该hours字段中表示“每小时”。

?

没有具体值。当您不在乎值是什么时使用。例如,如果您希望计划在每月的特定日期触发,但不在乎星期几,则可以?day_of_week字段中指定

-

值的范围(含)。用于分隔最小值和最大值。例如,如果您希望时间表在上午9:00和下午5:00之间每小时触发一次,则可以9-17hours字段中指定

,

多个值。用于分隔字段的多个值。例如,如果您希望时间表在每个星期二和星期四触发,则可以TUE,THUday_of_week字段中指定

/

增量。指定时间增量时用于分隔值。第一个值代表起点,第二个值代表间隔。例如,如果您希望时间表从小时的顶部开始每20分钟触发一次,则可以0/20minutes字段中指定同样,从该月的第一天开始1/5day_of_month字段中指定将每5天触发一次。

L

最后的。在该day_of_month字段中使用时表示月份的最后一天-非years年的1月31日,2月的28日,4月的30日,依此类推。day_of_week字段中单独使用代替7SAT,或在一周中的特定日期之后选择该类型在月中的最后一天。例如,6L表示月份的最后一个星期五。您可以LWday_of_month字段中指定以指定该月的最后一个工作日。L在指定值列表或值范围时避免使用该选项,因为结果可能不会达到您的期望。

W

平日 用于指定最接近给定日期的工作日(星期一至星期五)。例如,如果您15Wday_of_month字段中指定而15号是星期六,那么时间表将在14号触发。如果15日是星期日,则时间表将在16日星期一触发。如果15日是星期二,则时间表将在15日星期二触发。但是,如果您将1W的值指定day_of_month且第一个是星期六,则时间表将在第3个星期一触发-它不会跳过月份边界。您可以LWday_of_month字段中指定以指定该月的最后一个工作日。您只能在W当天day_of_month是一天使用该选项-在指定日期范围或日期列表时无效。

#

一个月中的第N个XXX天。day_of_week字段中使用以指定每月的第XXX天。例如,如果指定6#1,则计划将在该月的第一个星期五触发。请注意,如果您指定3#5并且特定月份中没有5个星期二,则计划不会触发该月份。

(3.4)案例

设置每日触发

  0 5 9 * * ?

  每天在世界标准时间上午9:05触发。

  0 5 9 * * ? 2020

  2020年期间,每天在世界标准时间上午9:05触发。

将触发器限制在几天或时间范围内

  0 5 9 ? * MON-FRI

  星期一至星期五,世界标准时间上午9:05触发。

  0 0-5 9 * * ?

  从UTC上午9:00开始到UTC每天9:05结束,每分钟触发一次。

设置间隔触发

  0 0/15 9 * * ?

  从UTC上午9:00开始到每天UTC上午9:45结束,每15分钟触发一次。

  0 5 9 1/3 * ?

  从每月的第一天开始,每月每3天在UTC上午9:05触发。

设置在特定日期触发的时间表

  0 1 4 1 4 ?

  在每年世界标准时间4月1日凌晨4:01触发。

  0 0,30 9 ? 4 WED

  4月的每个星期三,在UTC上午9:00和UTC上午9:30触发。

  0 5 9 15 * ?

  在每个月的15日(世界标准时间)上午9:05触发。

  0 5 9 15W * ?

  在每个月15日最近的工作日(世界标准时间)上午9:05触发。

  0 5 9 ? * 6#1

  在每个月的第一个星期五上午9:05触发。

使用last设置触发器

  0 5 9 L * ?

  在每个月的最后一天上午9:05在世界标准时间触发。

  0 5 9 ? * 2L

  在每个月的最后一个星期一的UTC上午9:05触发。

  0 5 9 LW * ?

  在每个月的最后一个工作日世界标准时间上午9:05触发。 

 【参考文档】

  https://www.cnblogs.com/chenyanbin/p/13419497.html

posted @ 2021-04-08 17:17  郭大侠1  阅读(434)  评论(0编辑  收藏  举报