REST API用途
elasticsearch支持多种通讯,其中包括http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容。
ES提供了很多全面的API,常用的REST请求大致可以分成如下几种:
1 检查集群、节点、索引的健康情况
2 管理集群、节点,索引数据、元数据
3 执行CRUD,创建、读取、更新、删除 以及 查询
4 执行高级的查询操作,比如分页、排序、脚本、聚合等
Query DSL
--简介--
elasticsearch 提供基于JSON的完整的Query DSL查询表达式(DSL即领域专用语言). 一般来说, 普通的查询如 term 或者 prefix. 另外还有混合查询如 bool 等. 另外查询表达式(Queries)还能够关联特定的过滤表达式,如 filtered 或者 constant_score 查询.
你可以把Query DSL当作是一系列的抽象的查询表达式树( AST ). 特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了,是不是很灵活啊.
查询和过滤都可以被用于各种不同的API接口里面. 如 search query, 或者是 facet filter 等等. 本章会介绍构造AST能够用到的各种查询或者过滤器.
提示. 过滤器非常有用因为他们比简单的查询更快(不进行文档评分)并且会自动缓存.
过滤器和缓存(Filters and Caching)
过滤器是用来实现缓存的很好的办法. 因为缓存这些过滤结果并不需要太多的内存, 而且其它的查询可以重用这些过滤(注意是同样参数哦),所以速度是刷刷的.
某些过滤产生的结果是很易于缓存的,有关缓存与否的区别在于是否将过滤结果存放到缓存中,像如下过滤器如 term, terms, prefix, 和 range 默认就是会进行缓存的, 并且建议使用这些过滤条件而不使用同等效果的查询.
其它过滤器,一般会将字段数据加载到内存中来工作, 默认是不缓存结果的. 这些过滤操作的速度其实已经非常快了,如果将它们的结果缓存需要做额外的操作来使它们能够被其它查询使用,这些查询,包括地理位置的(geo), numeric_range, 和 script 默认是没有缓存结果的.
最后一个过滤器的类型是过滤器之间的组合, and, not 和 or ,这些过滤器是没有缓存结果的,因为它们主要是操作内联的过滤器,所以不需要过滤.
所有的过滤器都允许设置 _cache 元素来显式的控制缓存与否. 并且允许设置一个 _cache_key 用来当作缓存的主键. 这个在过滤大集合的情况下非常有用 (如包含很多元素的 terms filter).
查看集群状态
可以通过CURL命令发送REST命令,查询集群的健康状态:
curl 'localhost:9200/_cat/health?v'
Localhost是主机的地址,9200是监听的端口号,ES默认监听的端口号就是9200.
这里需要注意的是,windows下安装的CURL有可能不支持单引号,如果有报错,还请改成双引号,内部使用转义字符转义。
得到的相应结果。
结果说明:
可以看到集群的名字是默认的"elasticsearch",集群的状态时"green"。这个颜色之前也有说过:
1 绿色,最健康的状态,代表所有的分片包括备份都可用
2 黄色,基本的分片可用,但是备份不可用(也可能是没有备份)
3 红色,部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好。
上面的结果还可以看到,目前有一个节点,但是没有分片,这是因为我们的ES中还没有数据,一次也就没有分片。
当使用elasticsearch作为集群名字时,会使用单播,查询本机上是否还运行着其他的节点。如果有,则组成一个集群。
(如果使用其他的名字作为集群名字,那么就可能采用多播了!这个在工作中,经常会遇到,大家使用的是一个集群名字,分片总是被搞在一起,导致有人的机器下线后,自己的也无法使用)
通过下面的命令,可以查询节点的列表:
curl 'localhost:9200/_cat/nodes?v'
查看所有的索引
在ES中索引有两个意思:
1 动词的索引,表示把数据存储到ES中,提供搜索的过程;这期间可能正在执行一个创建搜索的过程。
2 名字的索引,它是ES中的一个存储类型,与数据库类似,内部包含type字段,type中包含各种文档。
通过下面的命令可以查看所有的索引:
curl 'localhost:9200/_cat/indices?v'
得到的结果如下:
[sfapp@cmos1 ~]$ curl 'localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open blog FAPav5jTREu_dY7m4ZNMgw 5 1 1 0 4.5kb 4.5kb
yellow open logstash-2017.03.09 BXtC_5dRSU2L8rDXvykCxg 5 1 5 0 20.7kb 20.7kb
[sfapp@cmos1 ~]$
由于集群中没有任何的数据,上面的结果中也就只包含列的信息了。
创建索引
创建索引
curl -XPUT localhost:9200/索引名/类型/id -d {//JSON格式的body体}
查询索引
curl -XGET localhost:9200/索引名/类型/id
下面是创建索引,以及查询索引的例子:
curl -XPUT 'localhost:9200/testindex/orders/2?pretty' -d '{
"zone_id": "1",
"user_id": "100008",
"try_deliver_times": 102,
"trade_status": "TRADE_FINISHED",
"trade_no": "xiaomi.21142736250938334726",
"trade_currency": "CNY",
"total_fee": 100,
"status": "paid",
"sdk_user_id": "69272363",
"sdk": "xiaomi",
"price": 1,
"platform": "android",
"paid_channel": "unknown",
"paid_at": 1427370289,
"market": "unknown",
"location": "local",
"last_try_deliver_at": 1427856948,
"is_guest": 0,
"id": "fa6044d2fddb15681ea2637335f3ae6b7f8e76fef53bd805108a032cb3eb54cd",
"goods_name": "一小堆元宝",
"goods_id": "ID_001",
"goods_count": "1",
"expires_in": 2592000,
"delivered_at": 0,
"debug_mode": true,
"created_at": 1427362509,
"cp_result": "exception encountered",
"cp_order_id": "cp.order.id.test",
"client_id": "9c98152c6b42c7cb3f41b53f18a0d868",
"app_user_id": "fvu100006"
}'
看结果:
[sfapp@cmos1 ekfile]$ curl -XGET 'localhost:9200/testindex/orders/2?pretty'
{
"_index" : "testindex",
"_type" : "orders",
"_id" : "2",
"_version" : 1,
"found" : true,
"_source" : {
"zone_id" : "1",
"user_id" : "100008",
"try_deliver_times" : 102,
"trade_status" : "TRADE_FINISHED",
"trade_no" : "xiaomi.21142736250938334726",
"trade_currency" : "CNY",
"total_fee" : 100,
"status" : "paid",
"sdk_user_id" : "69272363",
"sdk" : "xiaomi",
"price" : 1,
"platform" : "android",
"paid_channel" : "unknown",
"paid_at" : 1427370289,
"market" : "unknown",
"location" : "local",
"last_try_deliver_at" : 1427856948,
"is_guest" : 0,
"id" : "fa6044d2fddb15681ea2637335f3ae6b7f8e76fef53bd805108a032cb3eb54cd",
"goods_name" : "一小堆元宝",
"goods_id" : "ID_001",
"goods_count" : "1",
"expires_in" : 2592000,
"delivered_at" : 0,
"debug_mode" : true,
"created_at" : 1427362509,
"cp_result" : "exception encountered",
"cp_order_id" : "cp.order.id.test",
"client_id" : "9c98152c6b42c7cb3f41b53f18a0d868",
"app_user_id" : "fvu100006"
}
}
[sfapp@cmos1 ekfile]$
上面的结果中,customer索引的状态是yellow,这是因为此时虽然有5个主分片和一个备份。但是由于只是单个节点,我们的分片还在运行中,无法动态的修改。因此当有其他的节点加入到集群中,备份的节点会被拷贝到另一个节点中,状态就会变成green。
索引和搜索文档
之前说过,索引里面还有类型的概念,在索引文档之前要先设置类型type。
执行的命令如下:
curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'
执行成功后会得到如下的信息:
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"created" : true
}
注意2.0版本的ES在同一索引下,不同的类型,相同的字段名字,是不允许字段类型不一致的。
上面的例子中,为我们创建了一个文档,并且id自动设置为1.
ES不需要再索引文档前,不需要明确的创建索引,如果执行上面的命令,索引不存在,也会自动的创建索引。
执行下面的命令查询,返回信息也如下:
[sfapp@cmos1 ~]$ curl -XGET 'localhost:9200/customer/external/1?pretty'
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
[sfapp@cmos1 ~]$
这里会新增两个字段:
1 found 描述了请求信息
2 _source 为之前索引时的数据
删除索引
语法:
curl -XDELETE localhost:9200/索引名
执行下面的命令就可以删除索引:
curl -XDELETE 'localhost:9200/customer?pretty'
返回结果:
{
"acknowledged": true
}
总结
总结上面涉及到的命令大致如下:
curl -XPUT 'localhost:9200/customer'//创建索引
//插入数据
curl -XPUT 'localhost:9200/customer/external/1'-d '
{
"name": "John Doe"
}'
curl 'localhost:9200/customer/external/1'//查询数据
curl -XDELETE 'localhost:9200/customer'//删除索引
ES 使用bulk 添加数据(批量增加)
使用bulk命令,添加json文件中的数据。Bulk顾名思义,把多个单条的记录合并成一个大数组统一提交,这样避免一条条发送的header解析,索引频繁更新,indexing速度大大提高
1.新建json文件accounts.json,定义json数据格式,其中每个数据格式都是如下:
{
"index":{"_id":"1"}
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}
2.执行命令,批量添加:
curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
3.查询索引
curl 'localhost:9200/_cat/indices?v'
表示我们已经成功批量导入1000条数据索引到bank索引中。
Count根据POST的json,返回命中范围内的总条数。当然没POST时就直接返回该index的总条数了。
Search根据POST的json或者GET的args,返回命中范围内的数据。这是最重要的部分了。下面说说常用的search