Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25542
  • 博文数量: 13
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-19 21:58
文章分类

全部博文(13)

分类: NOSQL

2017-03-02 09:25:09

Elasticsearch的REST API通过HTTP协议以JSON的格式开放出来

本章节中列举的规范,适用于所有的REST API,除非特别说明


== 多索引 ==

大部分API操作的索引参数都支持跨多个索引,使用例如 test1,test2,test3 标记法,或使用 _all 表示全部索引,也支持通配符,例如 test*,*test 或 *test*,还有包含“add(+)”和“移除(-)”的能力,例如 +test*,-test3 表示操作所有名称以test开头的索引,但排除test3

所有多索引API都支持以下URL查询选项:

- ignore_unavailable
  如果指定的索引不可用是否自动忽略,例如该索引不存在或已关闭,可用值为true或false

- allow_no_indices
  是否允许指定的通配符匹配不到具体的索引,可用值为true或false,例如指定了foo*通配表达式,但没有可用的索引是以foo开头的,此时该操作是否失败,该选项也作用于 _all、* 或未指定索引的情况,还作用于别名(aliase),例如一个别名指向一个已关闭的索引

- expand_wildcards
  控制通配符扩展的索引类型,如果值为open,通配符只会匹配处于打开状态的索引,如果值为closed,则只会匹配关闭的索引,可以设置为 open,closed 或 all,表示匹配所有索引,还能设置为none,表示禁用通配符匹配

以上3个选项的默认值,取决于每个具体的API


== 索引名支持日期计算 ==

可以搜索以时间序列命名的一批索引,而不是频繁修改查询语句或维护别名,限定搜索的索引个数可降低集群负载,并提升执行性能,例如,在每天的日志文件中搜索错误信息,可使用日期计算模板限定只搜索近两天的索引

几乎所有API的索引参数都支持日期计算,类似于以下格式:



其中:
- static_name 是索引名的静态文本部分
- date_math_expr 是日期计算表达式,索引名的动态计算部分
- date_format 是计算出的日期格式,默认为YYYY.MM.dd
- time_zone 是可选的时区,默认为utc

必须使用尖括号包围整个日期计算表达式,并将特殊字符写成URI编码,例如:

$ curl -XGET '' -d '{"query":{"match":{"test":"data"}}}'

要写成如下形式:

$ curl -XGET '%3Clogstash-%7Bnow%2Fd%7D%3E/_search' -d '{"query":{"match":{"test":"data"}}}'

相关字符的URI编码表:
  <    %3C
  >    %3E
  /    %2F
  {    %7B
  }    %7D
  |    %7C
  +    %2B
  :    %3A
  ,    %2C

以下例子展示不同格式的日期计算表达式和对应的索引名,日期时间为2024-03-22 12:00:00 UTC

                       当前日期    logstash-2024.03.22
                       当前月份    logstash-2024.03.01
              只要年月    logstash-2024.03
           上一个月    logstash-2024.02
    12小时后    logstash-2024.03.23

如要在索引名的静态部分使用花括号{和},要使用反斜杠\逃逸它们,例如 解析结果为 elastic{ON}-2024.03.01

下例展示搜索近三天的logstash开头的索引请求:

$ curl -XGET ',,/_search' -d '{
  "query": { "match": { "test": "data" } }
}'

转换成URI编码为:

$ curl -XGET '%3Clogstash-%7Bnow%2Fd-2d%7D%3E%2C%3Clogstash-%7Bnow%2Fd-1d%7D%3E%2C%3Clogstash-%7Bnow%2Fd%7D%3E/_search' -d '{
  "query": { "match": { "test": "data" } }
}'


== 常用选项 ==

以下选项可应用在所有REST API上

【美化返回结果】

在请求URL后附加 ?pretty=true,JSON结果将以美观格式返回,另一个选项是 ?format=yaml,结果将以更可读的YAML格式返回

【可阅读格式输出】

在默认情况下,或请求URL后附加 ?human=false 时,统计信息以适用于计算的方法返回,例如 "exists_time_in_millis": 3600000 或 "size_in_bytes": 1024,这利于监控工具的计算,当在请求URL后附加 ?human=true 时,统计信息以适合人类阅读的格式返回,例如 "exists_time": "1h" 或 "size": "1kb"

【日期计算】

多数参数都接受格式化的日期数据,例如范围查询中的gt和lt,或分页中的from和to,都能理解日期计算

表达式以待计算的日期开头,可以是now,表示当前日期时间,或是以||结尾的日期字符串,还能选用以下一个或多个计算表达式:

  +1h  加1小时
  -1d  减1天
  /d   最近的日期

支持的时间单位有:

  y  years
  M  months
  w  weeks
  d  days
  h  hours
  H  hours
  m  minutes
  s  seconds

一些例子如下:

  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 过滤参数,可用于指定Elasticsearch应答的返回内容,该参数接受一个以逗号分隔的一连串点标记过滤表达式,例如:

$ curl -XGET '172.16.88.31:9200/bank/account/_search?pretty&filter_path=hits.total,hits.hits._score,hits.hits._source.account_number' -d '{"query":{"match":{"address" : "671 Bristol Street"}}}'

返回结果为:
{
  "hits" : {
    "total" : 2,
    "hits" : [
      {
        "_score" : 0.7594807,
        "_source" : {
          "account_number" : 6
        }
      },
      {
        "_score" : 0.6099695,
        "_source" : {
          "account_number" : 13
        }
      }
    ]
  }
}
hits中只有filter_path指定的列

也可用统配符*匹配任意字段或字段名,例如:

$ curl -XGET '172.16.88.31:9200/bank/account/_search?pretty&filter_path=hits.total,hits.hits._score,hits.hits._source.*name' -d '{"query":{"match":{"address" : "671 Bristol Street"}}}'

返回结果为:
{
  "hits" : {
    "total" : 2,
    "hits" : [
      {
        "_score" : 0.7594807,
        "_source" : {
          "firstname" : "Hattie",
          "lastname" : "Bond"
        }
      },
      {
        "_score" : 0.6099695,
        "_source" : {
          "firstname" : "Nanette",
          "lastname" : "Bates"
        }
      }
    ]
  }
}

通配符**用于省略多层,如上例的 hits.hits._source.*name 可改写为 hits.**.*name,如此还能匹配到 hits.hits._source.education.schoolname

也可用以字符-为前缀的过滤器来排除一个或多个字段,例如:

$ curl -XGET '172.16.88.31:9200/bank/account/_count?pretty&filter_path=-_shards'

返回结果为:
{
  "count" : 3
}

在一个表达式中,当包含过滤器和排除过滤器同时出现时,排除过滤先被应用,得到执行结果后再应用包含过滤器提取字段

【时间单位】

某些用时参数(如timeout)需要指定度量单位,类似2d为2天,所有可用单位如下:

  d       天
  h       时
  m       分
  s       秒
  ms      毫秒
  micros  微秒
  nanos   纳秒

【距离单位】

某些距离参数(如distance)需要指定度量单位,当不指定时默认为米(meter),所有可用单位有:

  in   英寸
  ft   英尺
  mi   英里
  yd   码
  mm   毫米
  cm   厘米
  m    米
  km   千米
  nmi  海里


== 基于URL的访问控制 ==

例如multi-search、multi-get和bulk请求,用户既可以在URL中指定索引,也可以在请求体(body)里为每个操作单独指定索引,这对基于URL的访问控制带来了挑战

为防止用户覆盖URL中指定的索引,可在config.yml文件中增加如下配置项:

rest.action.multi.allow_explicit_index: false

默认值为true,当设置为false时,Elasticsearch将拒绝执行在请求体中指定索引的请求


阅读(968) | 评论(0) | 转发(0) |
0

上一篇:配置(Setup Elasticsearch)

下一篇:MongoDB介绍

给主人留下些什么吧!~~