Elasticsearch用户指南 三 API约定

版本5.0 官方文档英文版

相关文章:

elasticsearch REST API 使用JSON通过HTTP协议传输。

本约定贯穿整个REST API,除非有特别的说明。

一、多重索引

大多数APIs引用到一个index参数来在多个索引中执行操作,使用简单的test1,test2,test3标记法(或者_all表示所有索引)。它也支持通配符的方式,例如:test* 或者 *test 或者 te*t 或者 *test*,并且还有“加”和“减”的能力,例如:+test*,-test3

所有的多索引API都支持下面的url字符查询参数:

ignore_unavailable

控制是否忽略那些不可用的索引,可以指定true 或者 false

allow_no_indices

控制如果一个通配符索引表达式没有匹配到任何索引时是否失败。可以指定true 或者 false。这个设置也适用于_all*或者没有指定索引的情况。

expand_wildcards

控制通配符索引表达式的类型。如果是open,只匹配那些打开的索引;如果是closed,只匹配那些关闭的索引

上面这些设置的默认值根据不同的API是不同的。

二、索引名称中的Date math支持

Date math索引名称解决方案允许你去搜索一个范围的时间序列索引而不是搜索所有的时间序列索引然后过滤结果或者维护别名。限制搜索索引的数量可以减少集群的负载并且提升执行性能。例如你要在每天的日志中搜索错误,你可以使用一个date math名称模版来只搜索过去两天内的索引。

几乎所有的API都拥有一个index参数,支持date math。

一个date math索引名称是如下形式:

<static_name{date_math_expr{date_format|time_zone}}>
属性名 描述
static_name 索引名称的静态部分
date_math_expr 一个动态date math表达式,可以动态计算时间
date_format 可选的日期格式化参数。默认是YYYY.MM.dd
time_zone 可选的时区参数。默认是utc

你必须用尖叫括号围绕date math索引名称表达式,并且所有特殊符号应该被URI编码。例如:

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

部分date math字符编码

特殊字符 URI编码
< %3C
> %3E
/ %2F
{ %7B
} %7D
%7C
+ %2B
: %3A

注意:|在表格里显式有问题,所有用了一个中文的丨(这是一个汉字)。

下面是一些例子,假设现在是2014年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

注意:|在表格里显式有问题,所有用了一个中文的丨(这是一个汉字)。

如果想在静态部分使用特殊字符,需要在前面加\\,例如:

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

下面的例子展示了一个搜索请求搜索过去3天内的日志文件,使用默认的日期格式化样式:

# 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"
    }
  }
}

三、通用选项

下面这些选项可以被应用到所有的REST API。

格式良好的结果

当在任何请求后面追加?pretty=true会使得返回格式良好的JSON(只限debug!!)。当设置为?format=yaml时结果将会是更可读的yaml格式。

人类可读的输出

统计返回的结果是一种适合人类阅读的格式(例如:"exists_time": "1h" 或者 "size": "1kb"),对于计算机是"exists_time_in_millis": 3600000 or "size_in_bytes": 1024。人类可读这个选项可以在查询字符串后添加?human=false来关闭,这个适合统计结果被某种监控工具来使用。同时这也是默认选项。

日期计算

大多数参数接收一个格式化后的日期值,例如gtlt在范围查询里,或者fromto在日起范围聚合里。

表达式开始于一个锚点日期,可以是now或者以||结尾的日期字符串。这个锚点日期可以随意的追加一个或多个数学表达式组合:

  • +1h 增加1小时
  • -1d 减少1天
  • /d 四舍五入定位到最近的天

支持的时间单位有:

时间单位 描述
y
M
w 星期
d
h 小时(12小时制)
H 小时(24小时制)
m 分钟
s

一些示例:

示例 描述
now+1h 当前时间增加1小时,使用毫秒解析
now+1h+1m 当前时间增加1小时零1分钟,使用毫秒解析
now+1h/d 当前时间增加1小时,四舍五入到最近的天
2015-01-01丨丨+1M/d 2015-01-01增加1个月,四舍五入到最近的天

注意:|在表格里显式有问题,所有用了一个中文的丨(这是一个汉字)。

响应过滤

所有的REST API接受一个filter_path参数,它可以用来减少响应的返回字段。参数使用逗号分割并且使用点记法表示:

GET /_search?q=elasticsearch&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" : {
      "twitter": {"state": "open"}
    }
  }
}

**通配符可以在不知道准确字段路径的情况下进行匹配:

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

响应值:

{
  "routing_table": {
    "indices": {
      "twitter": {
        "shards": {
          "0": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
          "1": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
          "2": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
          "3": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
          "4": [{"state": "STARTED"}, {"state": "UNASSIGNED"}]
        }
      }
    }
  }
}

还可以使用-字符来排除一个或多个字段:

GET /_count?filter_path=-_shards

响应值:

{
  "count" : 5
}

包含和排斥过滤器可以混合使用:

GET /_cluster/state?filter_path=metadata.indices.*.state,-metadata.indices.logstash-*

响应值:

{
  "metadata" : {
    "indices" : {
      "index-1" : {"state" : "open"},
      "index-2" : {"state" : "open"},
      "index-3" : {"state" : "open"}
    }
  }
}

注意,有时elasticsearch会直接返回未加工的值,例如_source字段。你应该考虑组合已经存在的_source参数和filter_path参数:

POST /library/book?refresh
{"title": "Book #1", "rating": 200.1}
POST /library/book?refresh
{"title": "Book #2", "rating": 1.7}
POST /library/book?refresh
{"title": "Book #3", "rating": 0.1}
GET /_search?filter_path=hits.hits._source&_source=title&sort=rating:desc
{
  "hits" : {
    "hits" : [ {
      "_source":{"title":"Book #1"}
    }, {
      "_source":{"title":"Book #2"}
    }, {
      "_source":{"title":"Book #3"}
    } ]
  }
}

Flat设置

flat_settings的值是true时,响应将会以flat格式返回:

GET twitter/_settings?flat_settings=true

返回值:

{
  "twitter" : {
    "settings": {
      "index.number_of_replicas": "1",
      "index.number_of_shards": "1",
      "index.creation_date": "1474389951325",
      "index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
      "index.version.created": ...,
      "index.provided_name" : "twitter"
    }
  }
}

flat_settings的值是false时,返回值将会以更适合人类阅读的结构格式化:

GET twitter/_settings?flat_settings=false

返回值:

{
  "twitter" : {
    "settings" : {
      "index" : {
        "number_of_replicas": "1",
        "number_of_shards": "1",
        "creation_date": "1474389951325",
        "uuid": "n6gzFZTgS664GUfx0Xrpjw",
        "version": {
          "created": ...
        },
        "provided_name" : "twitter"
      }
    }
  }
}

默认flat_settings的值是false

参数

Rest参数(当使用HTTP时,对应HTTP URL参数)按照约定使用下划线包装。

时间单位

当一个时间段需要被指定时,那么它的单位也必须被指定,比如2d代表2天。支持的单位有:

时间单位 描述
d
h 小时
m 分钟
s
ms 毫秒
micros 微秒
nanos 纳秒

字节尺寸单位

有些参数是需要指定字节尺寸的。Elasticsearch支持的单位有:bkbmbgbtbpb

尺寸单位 描述
b
kb 小时
mb 分钟
gb
tb 毫秒
pb 微秒

简写单位数量

例如我们不需要写7000,而可以写7k,支持的乘数有:

乘数 描述
k
m 百万
g 十亿
t
p 千兆

启用堆栈跟踪

默认的当一个请求返回一个错误时Elasticsearch不会输出错误的堆栈跟踪信息。你可以通过追加error_trace=true来启用堆栈跟踪。例如:

POST /twitter/_search?size=surprise_me&error_trace=true

返回结果会像这样:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Failed to parse int parameter [size] with value [surprise_me]",
        "stack_trace": "Failed to parse int parameter [size] with value [surprise_me]]; nested: IllegalArgumentException..."
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Failed to parse int parameter [size] with value [surprise_me]",
    "stack_trace": "java.lang.IllegalArgumentException: Failed to parse int parameter [size] with value [surprise_me]\n    at org.elasticsearch.rest.RestRequest.paramAsInt(RestRequest.java:175)...",
    "caused_by": {
      "type": "number_format_exception",
      "reason": "For input string: \"surprise_me\"",
      "stack_trace": "java.lang.NumberFormatException: For input string: \"surprise_me\"\n    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)..."
    }
  },
  "status": 400
}

四、基于URL的访问控制

许多用户使用一个代理进行基于URL的访问控制,来保护对Elasticsearch的索引访问。对于multi-search, multi-get 和 bulk请求,用户可以选择在URL里指定一个索引或者每个单独的请求体里。这使得基于URL的访问控制非常有挑战性。

为了防止用户重新URL里指定的索引,添加下面的设置到config.yml文件:

rest.action.multi.allow_explicit_index: false

默认值是true,当设置为false时,Elasticsearch将会拒绝一个在请求体中指定索引的请求。

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

推荐阅读更多精彩内容

  • 博客原文一博客原文二 翻译作品,水平有限,如有错误,烦请留言指正。原文请见 官网英文文档 起步 Elasticse...
    rabbitGYK阅读 3,230评论 0 68
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,934评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 【青春都市励志】长篇连载小说:《马丫》作者:红山老妖 她脱掉了连衣裙...... “你一定要记得我哦!我叫马丫,吗...
    红山老妖阅读 1,998评论 2 6
  • 七绝 秋 疏星向月露新凉,丹桂飘香酒竞尝。 遥寄乡思千万缕,欢欣还梦旧时光。 十六字令 秋 秋,露冷风寒霜叶稠。...
    清风ru梦阅读 216评论 0 5