exploring your cluster 探索你的集群
现在我们的节点(集群)已经启动了,下一步需要做的就是和集群进行交流。幸运的是,Elasticsearch提供了非常全面和强大的REST API,您可以使用与您的集群进行交互。可以使用API来完成的几件事情如下:
- 检查您的群集,节点和索引健康状态,和统计信息
- 管理您的群集,节点以及索引数据和元数据
- 在你的索引上执行CRUD(创建,读取,更新和删除)和搜索等操作
- 执行高级搜索操作,如分页,排序,过滤,scripting, faceting, aggregations等等
cluster health 集群健康
让我们从基本的集群健康检查开始,通过这个检查,我们可以观察我们的集群是如何工作的(正在做什么)。我们将使用 curl 这个工具来进行一系列操作。当然,你可以使用任何其它的支持 HTTP/REST 调用的工具。假定我们依然在刚启动的节点上工作,打开一个新的 Shell .
要检查集群健康状态,需要使用 _cat API. 输入:
<span style="font-size:14px;">curl 'localhost:9200/_cat/health?v'</span>
可能的结果是:
<span style="font-size:14px;">epoch timestamp cluster status node.total node.data shards pri relo init unassign
1394735289 14:28:09 elasticsearch green 1 1 0 0 0 0 0</span>
我们可以看到我们的名称为 elasticsearch 的集群正在工作,并且状态为 green.每当我们检查集群运行状态时会得到描述集群状态的三种颜色值之一. green, red, yellow. green 表示集群所有节点都在正常的工作;yellow表示集群节点中的数据都是可访问的(集群正常工作),但是有一部分副本无法分配; red意味着集群某些节点中的数据因为某种原因导致不可用。注意,尽管集群运行状态是red, 集群也是可以部分工作的,它会在可用的分片中执行搜索请求。但你需要尽快解决存在的问题,因为这个时候你的数据可能丢失了或者存在其它问题。
从上述响应中,我们还可以发现,此时我们一共有一个节点,0个分片,因为我们的集群中还未存储数据。注意,因为我们使用集群的默认名称 elasticsearch 并且,elasticsearch在默认情况下使用多路广播来发现同一网段下其它节点,所以你可能意外的启动一些其它的节点,这些节点自动的加入到了你的集群中。在这种情况下,你所获得的响应中可能不止一个节点。
我们可以通过如下方式获取集群中的节点列表:
<span style="font-size:14px;">curl 'localhost:9200/_cat/nodes?v'</span>
可能的响应结果:
<span style="font-size:14px;">curl 'localhost:9200/_cat/nodes?v'
host ip heap.percent ram.percent load node.role master name
mwubuntu1 127.0.1.1 8 4 0.00 d * New Goblin</span>
我们可以发现,我们的集群中只有一个节点,名称为"New Goblin".
list all indexes 列出索引
通过如下命令获取集群中的索引列表:
<span style="font-size:14px;">curl 'localhost:9200/_cat/indices?v'</span>
可能的响应结果:
<span style="font-size:14px;">health index pri rep docs.count docs.deleted store.size pri.store.size</span>
这意味着我们的集群中还没有索引。
例如如下响应,意味着我们的集群中有索引:
<span style="font-size:14px;">health index pri rep docs.count docs.deleted store.size pri.store.size
yellow logstash-2014.06.07 5 1 328907 0 305.5mb 305.5mb
yellow blogs 3 1 0 0 333b 333b
yellow kibana-int 5 1 1 0 8.1kb 8.1kb
yellow logstash-2011.05.18 5 1 2 0 10.3kb 10.3kb
yellow logstash-2013.12.11 5 1 1 0 8kb 8kb
yellow logstash-2014.05.29 5 1 4 0 13.7kb 13.7kb
yellow shakespeare 5 1 43880 0 7.8mb 7.8mb
yellow megacorp 5 1 4 0 12.9kb 12.9kb
yellow mega2orp 5 1 1 0 3.6kb 3.6kb
</span>
create an index 创建一个索引
现在,让我们创建一个名为“customer”的索引,并重新列出所有的索引:
<span style="font-size:14px;">curl -XPUT 'localhost:9200/customer?pretty'
curl 'localhost:9200/_cat/indices?v'</span>
第一条命令,我们使用PUT 方法创建了一个名称为"customer"的索引,并且使用一个pretty参数告诉集群让它返回一个格式美观的JSON响应。
第一条命令的响应:
<span style="font-size:14px;">{
"acknowledged" : true
}</span>
第二条命令的响应:<span style="font-size:14px;">health index pri rep docs.count docs.deleted store.size pri.store.size
yellow customer 5 1 0 0 495b 495b</span>
第二条命令的响应告诉我们,现在我们的集群中有一个名为 "customer"的索引,该索引有5个原始分片,一个副本。
你可能注意到了,此索引的health状态标识为yellow,这说明这个索引的副本没有被分配。因为我们目前只有一个节点,为了保证高可用性,副本是不会被分配到和它原始分片相同的节点上的。等到有新的节点加入到集群中后,副本会再分配。那时再查看索引状态的话,yellow就会变为green.
index and query a document 索引并查询一个文档
现在,让我们向customer索引中添加一些内容。回想之前提到过的,要想在索引中索引一个文档,必须指明elasticsearch该文档的在索引中的类型 。让我们索引一个简单的客户文档到索引中。客户文档索引类型为"external",并拥有一个 ID 1。
<span style="font-size:14px;">curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'</span>
响应如下:
<span style="font-size:14px;">{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"created" : true
}</span>
从上述的响应中我们可以看出,一个新的客户文档已经被索引到了customer索引中,并且类型为external,拥有ID 为 1.
需要注意的是,elasticsearch 并不用在索引一个文档之前首先显式的创建索引,在刚才的例子中,elasticsearch会自动的创建customer索引,如果它不存在的话。
现在,让我们检索一下我们刚刚索引的文件:
<span style="font-size:14px;">curl -XGET 'localhost:9200/customer/external/1?pretty'</span>
响应结果:
<span style="font-size:14px;">curl -XGET 'localhost:9200/customer/external/1?pretty'
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"found" : true, "_source" : { "name": "John Doe" }
}</span>
我们发现,结果只是多了一个 found 的域,我们索引的文档在 _source域里面。
delete an index 删除一个索引
让我们删除刚才创建的索引,并查看索引列表
<span style="font-size:14px;">curl -XDELETE 'localhost:9200/customer?pretty'
curl 'localhost:9200/_cat/indices?v'</span>
响应结果:
<span style="font-size:14px;">curl -XDELETE 'localhost:9200/customer?pretty'
{
"acknowledged" : true
}
curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size</span>
这意味着我们已经成功删除了刚才创建的索引。
在进入下一步学习之前,让我们回顾一下学到的API的用法:
<span style="font-size:14px;">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'</span>
如果我们仔细研究了上面的命令,我们可以清楚地看到访问Elasticsearch数据的模式。该模式可以被概括如下:
<span style="font-size:14px;">curl -<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID></span>
这种模式在 elasticsearch REST API中是非常普遍的,记住它,对于你掌握其它命令非常有帮助。