在 elasticsearch 5.x - 初步安装 文章中,已经成功启动了一个单节点的ES集群,并通过 localhost:9200 访问了ES的restful接口,获取到了本节点的一些信息。Elasticsearch 提供了非常全面和强大的REST API,我们可以通过它去跟集群交互。通过API我们可以完成如下的功能:
- 检查集群,节点和索引的健康状况,状态和统计数据
- 管理集群,节点和索引的数据和原数据
- 执行CRUD(增删改查)操作,依靠索引进行搜索
- 执行高级搜索操作,比如分页,排序,过滤,脚本化,聚集等等
通过 URL : 可以查看RESTFUL API提供的接口情况
集群健康监控
我们可以通过 restful api 了解集群的运行情况。使用 _cat API
去检查集群健康状态。通过 URL :http:// http://localhost:9200/_cat 查看RESTFUL API提供的接口情况
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates
检查集群健康状态
localhost:9200/_cat/health?v&pretty
返回的内容
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1564215146 16:12:26 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%
“elasticsearch”的集群正在运行,状态标识为green
。
无论何时查看集群健康状态,我们会得到green
、yellow
、red
中的任何一个。
- Green - 一切运行正常(集群功能齐全)
- Yellow - 所有数据是可以获取的,但是一些副本还没有被分配(集群功能齐全)
- Red - 一些数据因为一些原因获取不到(集群部分功能不可用)
注意:当一个集群处于red状态时,它会通过可用的分片继续提供搜索服务,但是当有未分配的分片时,你需要尽快的修复它。
另外,从上面的返回结果中我们可以看到,当我们里面没有数据时,总共有1个节点,0个分片。注意当我们使用默认的集群名称(elasticsearch)并且当Elasticsearch默认使用单播网络发现在同一台机器上的其它节点时,很可能你会在你电脑上不小心启动不止一个节点并且他们都加入了一个集群。在这种情况下,你可能会从上面的返回结果中看到不止一个节点。
获取集群中的节点列表
http://192.168.3.25:9200/_cat/nodes?v&pretty
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 12 42 10 mdi * iy6LwI6
增删改查索引和文档
ES访问数据的格式如下:
///
- 索引
索引(index)是ElasticSearch存放具体数据的地方,是一类具有相似特征的文档的集合。ElasticSearch中索引的概念具有不同意思,这里的索引相当于关系数据库中的一个数据库实例。在ElasticSearch中索引还可以作为动词,表示对数据进行索引操作。
- 类型
在6.0之前的版本,一个ElasticSearch索引中,可以有多个类型;从6.0版本开始,,一个ElasticSearch索引中,只有1个类型。一个类型是索引的一个逻辑上的分类,通常具有一组相同字段的文档组成。
- 文档
文档是ElasticSearch可被索引的基础逻辑单元,相当于关系数据库中数据表的一行数据。ElasticSearch的文档具有JSON格式,由多个字段组成
1、创建一个索引
创建一个索引,名称为“customer” 。在请求后面追加pretty
参数来使返回值以格式化过美观的JSON输出
PUT方式
http://192.168.3.25:9200/customer?pretty
返回
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "customer"
}
返回的信息里面有索引名称:customer,是否成功创建 acknowledged 。
2、列出所有的索引
GET方式
http://localhost:9200/_cat/indices?v&pretty
返回数据
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open customer a2RuM8LpQXGtjRh-c5J1yw 5 1 0 0 810b 810b
返回结果告诉我们,现在有1个名称为“customer”的索引,并且有5个主分片和1个拷贝(默认情况),并且里面包含0个文档。
customer索引的健康状态是yellow,回忆我们之前讨论过的,yellow的意思是有一些拷贝还没有被分配。索引发生这种情况的原因是Elasticsearch默认为当前索引创建一个拷贝。但是当前我们只启动了一个节点,这个拷贝直到一段时间后有另一个节点加入集群之前,不会被分配(为了高可用,拷贝不会与索引分配到同一个节点上)。一旦拷贝在第二个节点上获得分配,这个索引的健康状态就会变成green。
3、添加文档
通过HTTP协议的PUT请求,Content-Type: application/json,添加 json 格式的内容
http://localhost:9200/customer/doc/1?pretty
内容:
{
"name": "hugo"
}
返回的内容
{
"_index" : "customer",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
一个新的顾客文档已经在customer索引中成功创建。type为doc,同时这个文档有一个自己的id,这个id就是我们在将文档加入索引时指定的。
这里有一个重要的注意点,你不需要在将一个文档加入一个索引前明确的将这个索引预先创建好。在上面我们创建文档的例子中,如果这个customer索引事先不存在,Elasticsearch会自动创建customer索引。
4. 查看文档
GET方式
localhost:9200/customer/doc/1?pretty
返回的内容
{
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "hugo"
}
}
found属性表示通过请求ID为1发现了一个文档,还有另一个属性_source
,_source属性返回在上一步中加入索引的完整JSON文档内容。
删除索引
HTTP协议的DELETE方法,删除前面创建的customer索引
localhost:9200/customer?pretty
返回的内容
{
"acknowledged": true
}
修改前面的文档内容
与添加文档的方式相同,不同的是,如果指定的文档已经存在,返回的内容会显示是update,返回的内容如下:
{
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
result 为 updated,created为false。version也被递增变成了2
Elasticsearch提供了一次更新多个文档的功能,通过使用查询条件(比如SQL的UPDATE-WHERE语句)。详情查看docs-update-by-query API
删除文档
DELETE方式请求。
localhost:9200/customer/doc/1?pretty
返回内容
{
"found": true,
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
查看_delete_by_query API去删除匹配特定条件的所有的文档。有一个值得注意的的地方是,直接删除整个索引比通过Query API删除索引中的所有文档更高效。
批处理
除了在单个文档上执行索引,更新和删除操作外,Elasticsearch还提供了批操作的功能,通过使用 _bulk
API完成。这个功能非常重要,因为它提供了一种非常高效的机制去通过更少的网络切换尽可能快的执行多个操作。