Elasticsearch对外提供的API是以Http协议的方式,通过JSON格式以REST约定对外提供。



HTTP的配置

HTTP配置文件是放在elasticsearch.yml中,注意的是所有与HTTP配置相关的内容都是静态配置,也就是需要重启后才生效。HTTP对外接口模块是可以禁用的,只需要设置http.enabled 为false。Elasticsearch集群中的通信是通过内部接口实现的,而不是HTTP协议。在集群中不需要所有节点都开启HTTP协议,正常情况下,只需要在一个节点上开启HTTP协议。



多索引参数

  大多数API支持多索引查询,就是同时可以查询多个索引中的数据,例如,参数test1,test2,test3,表示同时搜索test1,test2,test3三个索引中中的数据,或者用(_all全部索引,_all是内部定义的关键字)。在参数中同时支持通配符的操作,例如test*,表示查询所有以test开头的索引。同时也支持排除操作,例如+test*,-test3表示查询所有test开头的索引,排除test3。同时多索引查询还支持一下参数:

ignore_unavailable:当索引不存在或者关闭的时候,是否忽略这些索引,值为true和false。

allow_no_indices:当使用通配符查询所有索引的时候,当有索引不存在的时候是否返回查询失败。值为true和false

expand_wildcards :控制什么类似的索引被支持,值为open,close,none,all,open表示只支持open类型的索引,close表示只支持关闭状态的索引,none表示不可用,all表示同时支持open和close索引。

备注:文档操作API和索引别名API不支持多索引参数。



日期筛选

  日期筛选可以让搜索限定在指定的日期内,而不是搜索全部内容,通过时间限定,可以从集群中减少搜索的内容,提高搜索效率和减少资源占用。例如只搜索最近两天的错误日志。

备注:几乎所有的API都支持日期筛选。

  日期筛选的语法为:


<static_name{date_math_expr{date_format|time_zone}}>

语法解释:

static_name :索引的名称;

date_math_expr:动态日期计算表达式;

date_format :日期格式;

time_zone:时区,默认为UTC。

例如:


curl -XGET 'localhost:9200/<logstash-{now%2Fd-2d}>/_search' {
  "query" : {
    ...
  }
}

备注:由于url编码的问题/被替换成了%2F。

假设当前时间为2013.7.17日中午,下面列举几个例子:

<secilog-{now/d}>:secilog-20130.7.17

<secilog-{now/M}>secilog-2013.07.01

<secilog-{now/M{YYYY.MM}}>secilog-2013.07

<secilog-{now/M-1M{YYYY.MM}}>secilog-2013.06

<secilog-{now/d{YYYY.MM.dd|+12:00}}secilog-2013.7.18

备注:如果索引名称有{},可以通过添加\来代替,如:

<elastic\\{ON\\}-{now/M}>被转换为 elastic{ON}-2013.07.01

时间搜索也可以通过逗号,来选择多个时间,例如,选择最近三天的数据:


curl -XGET 'localhost:9200/<secilog-{now%2Fd-2d}>,<secilog-{now%2Fd-1d}>,<secilog-{now%2Fd}>/_search' {
  "query" : {
    ...
  }
}

本文由赛克蓝德(secisland)原创,转载请标明作者和出处。



通用参数

返回的结果具有可读的YAML格式。 

 human参数,对于统计数据,系统支持计算机数据,同时也支持比较日和人类阅读的数据,比如:计算机数据"exists_time_in_millis": 3600000 or "size_in_bytes": 1024,更适合人类阅读的数据:"exists_time": "1h" or "size": "1kb"。当?human=false 的时候,只输出计算机数据,当?human=ture的时候输出更适合人类阅读的数据,但这会消耗更多的资源,默认是false。

  日期表达式,大多数参数接受格式化日期表达式 , 如范围查询范围查询gt(大于)和lt(小于),或在日期聚合中用from to来表达时间范围。表达式设定的日期为now或者日期字符串加||。

• +1h - 增加一小时 

• -1d - 减少一个小时 

•/d - 上一个小时

所支持的时间单位为:y(年)、M(月)、w(周)、d(日)、h(小时)、m(分钟)、s(秒)。

例如:

now+1h :当前时间加一小时,以毫秒为单位。

now+1h+1m :当前时间加一小时和一分钟,以毫秒为单位。

now+1h/d :当前时间加一小时,四舍五入到最近的一天。

2015-01-01||+1M/d :2015-01-01加一个月,向下舍入到最接近的一天。

  响应过滤(filter_path)。所有的返回值可以通过filter_path来减少返回值的内容,多个值可以用逗号分开。例如:

curl -XGET 'localhost:9200/_search?pretty&filter_path=took,hits.hits._id,hits.hits._score'{
  "took" : 3,
  "hits" : {
    "hits" : [
      {
        "_id" : "3640",
        "_score" : 1.0
      },
      {
        "_id" : "3642",
        "_score" : 1.0
      }
    ]
  }
}

它也支持通配符*匹配任何部分字段的名称,例如: 

curl -XGET 'localhost:9200/_nodes/stats?filter_path=nodes.*.ho*'{
  "nodes" : {
    "lvJHed8uQQu4brS-SXKsNA" : {
      "host" : "portable"
    }
  }
}

我们可以用两个通配符**来匹配不确定名称的字段,例如我们可以返回Lucene版本的段信息:


curl 'localhost:9200/_segments?pretty&filter_path=indices.**.version'{
  "indices" : {
    "movies" : {
      "shards" : {
        "0" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ],
        "2" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ]
      }
    },
    "books" : {
      "shards" : {
        "0" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ]
      }
    }
  }
}

注意,有时直接返回Elasticsearch的某个字段的原始值,如_source字段。如果你想过滤_source字段,可以结合_source字段和filter_path参数,例如:

curl -XGET 'localhost:9200/_search?pretty&filter_path=hits.hits._source&_source=title'{
  "hits" : {
    "hits" : [ {
      "_source":{"title":"Book #2"}
    }, {
      "_source":{"title":"Book #1"}
    }, {
      "_source":{"title":"Book #3"}
    } ]
  }
}

紧凑参数flat_settings,flat_settings为true时候返回的内容更加的紧凑,false是返回的值更加的容易阅读。例如为true的时候:

{
  "persistent" : { },
  "transient" : {
    "discovery.zen.minimum_master_nodes" : "1"
  }
}

为false的时候,默认的情况下为false:

{
  "persistent" : { },
  "transient" : {
    "discovery" : {
      "zen" : {
        "minimum_master_nodes" : "1"
      }
    }
  }
}



基于URL的访问控制

  当多用户通过URL访问Elasticsearch索引的时候,为了防止用户误删除等操作,可以通过基于URL的访问控制来限制用户对某个具体索引的访问。可以在配置文件中添加参数:rest.action.multi.allow_explicit_index: false。这个参数默认为true。当为false的时候。在请求参数中指定具体索引的请求将会被拒绝。