美文网首页
ElasticSearch5.x研究日记2:索引与文档的基本操作

ElasticSearch5.x研究日记2:索引与文档的基本操作

作者: 不迷失 | 来源:发表于2017-01-22 22:13 被阅读488次

安装

本系列文章的es版本为5.1.1.

Elasticsearch至少需要Java 8.特别是在撰写本文时,建议您使用Oracle JDK版本1.8.0_73。
一旦我们设置了Java,我们可以下载并运行Elasticsearch。二进制文件可从www.elastic.co/downloads下载

让我们下载Elasticsearch 5.1.1 tar如下(Windows用户应该下载zip包):

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gz
然后解压缩如下(Windows用户应该解压缩zip包):

tar -xvf elasticsearch-5.1.1.tar.gz

然后它将在当前目录中创建一大堆文件和文件夹。然后我们进入bin目录,如下所示:

cd elasticsearch-5.1.1 / bin

现在我们准备好启动我们的节点和单集群(Windows用户应该运行elasticsearch.bat文件):

./elasticsearch

如果一切顺利,你应该看到一堆消息,如下所示:

[2016-09-16T14:17:51,251][INFO ][o.e.n.Node               ] [] initializing ...
[2016-09-16T14:17:51,329][INFO ][o.e.e.NodeEnvironment    ] [6-bjhwl] using [1] data paths, mounts [[/ (/dev/sda1)]], net usable_space [317.7gb], net total_space [453.6gb], spins? [no], types [ext4]
[2016-09-16T14:17:51,330][INFO ][o.e.e.NodeEnvironment    ] [6-bjhwl] heap size [1.9gb], compressed ordinary object pointers [true]
[2016-09-16T14:17:51,333][INFO ][o.e.n.Node               ] [6-bjhwl] node name [6-bjhwl] derived from node ID; set [node.name] to override
[2016-09-16T14:17:51,334][INFO ][o.e.n.Node               ] [6-bjhwl] version[5.1.1], pid[21261], build[f5daa16/2016-09-16T09:12:24.346Z], OS[Linux/4.4.0-36-generic/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_60/25.60-b23]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [aggs-matrix-stats]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [ingest-common]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [lang-expression]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [lang-groovy]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [lang-mustache]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [lang-painless]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [percolator]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [reindex]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [transport-netty3]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded module [transport-netty4]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService     ] [6-bjhwl] loaded plugin [mapper-murmur3]
[2016-09-16T14:17:53,521][INFO ][o.e.n.Node               ] [6-bjhwl] initialized
[2016-09-16T14:17:53,521][INFO ][o.e.n.Node               ] [6-bjhwl] starting ...
[2016-09-16T14:17:53,671][INFO ][o.e.t.TransportService   ] [6-bjhwl] publish_address {192.168.8.112:9300}, bound_addresses {{192.168.8.112:9300}
[2016-09-16T14:17:53,676][WARN ][o.e.b.BootstrapCheck     ] [6-bjhwl] max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
[2016-09-16T14:17:56,731][INFO ][o.e.h.HttpServer         ] [6-bjhwl] publish_address {192.168.8.112:9200}, bound_addresses {[::1]:9200}, {192.168.8.112:9200}
[2016-09-16T14:17:56,732][INFO ][o.e.g.GatewayService     ] [6-bjhwl] recovered [0] indices into cluster_state
[2016-09-16T14:17:56,748][INFO ][o.e.n.Node               ] [6-bjhwl] started

其中的6-bjhwl是节点的名称。我们能够通过命令行参数重新给集群和节点命名:

./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

默认情况下,Elasticsearch使用端口9200提供的REST API。这个端口是可配置的,如果必要的话。

现在,我们有elasticsearch运行了,下一步是要了解如何与它沟通。Elasticsearch提供了非常全面和强大的REST API。在API中可以做的一些事情如下:

  • 检查群集、节点和索引的健康、状态和统计数据.
  • 管理群集、节点和索引数据和元数据.
  • 执行CRUD(创建,读取,更新和删除)和对你的索引搜索操作
  • 执行高级搜索操作如分页、排序、过滤、脚本、聚合,和许多其他。

让我们开始一个基本的健康检查,我们可以用来看看我们的集群是如何做的.你可以使用任何工具进行HTTP、 REST调用的工具。

要检查群集运行状况,我们通过_cat接口即可获得。可以直接在浏览器中打开:

http://localhost:9200/_cat/health?v

将会输出

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1483949171 16:06:11  elasticsearch green           1         1      0   0    0    0        0             0                  -                100.0%

我们可以看到,我们的集群名为“elasticsearch”的是一个绿色的状态。

每当我们要求群集健康时,我们或者得到绿色,黄色或红色。绿色意味着一切都是好的(集群是完全功能的),黄色意味着所有数据可用,但一些副本还没有分配,红色意味着一些数据不可用。注意,即使一个集群是红色的,它仍然是部分可用的,但你可能需要修复它,因为你有缺少的数据。

从上面的响应,我们可以看到总共1个节点,我们有0个碎片,因为我们还没有数据。请注意,由于我们使用默认集群名称(elasticsearch),并且Elasticsearch默认使用单播网络发现来查找同一台计算机上的其他节点,因此可能会意外启动计算机上的多个节点,都加入一个集群。在这种情况下,您可能在上述响应中看到超过1个节点。

我们还可以得到我们的集群中的节点列表如下:

http://localhost:9200/_cat/nodes?v

列出所有索引:

http://localhost:9200/_cat/indices?v

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size

这仅仅意味着我们在集群中还没有索引。

创建索引编辑

现在让我们创建一个名为“customer”的索引

PUT http://localhost:9200/customer?pretty

添加pretty参数,告诉它漂亮打印JSON响应(如果有的话)。

然后再次列出所有索引:

http://localhost:9200/_cat/indices?v

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   customer  5n3U7JqISB6sJn_cbprHYg   5   1          0            0       650b           650b

结果告诉我们,我们现在有一个名为customer的索引,它有5个主分片和1个副本(默认值),它包含0个文档。

您可能还注意到,customer索引具有标记为黄色的健康。回想起前面的讨论,黄色意味着一些副本没有被分配。发生这种索引的原因是因为Elasticsearch默认情况下为此索引创建一个副本。因为我们目前只有一个节点运行,所以一个副本还不能被分配(为了高可用性),直到另一个节点加入集群的稍后时间点。一旦该副本被分配到第二个节点上,该索引的健康状态将变为绿色.

索引和查询文档

现在让我们把一些文档放到我们的customer索引中。为了索引文档,我们必须告诉Elasticsearch它应该去的索引中的类型,即数据库中的表,即下面的exernal。

我们向customer索引中的external表中放入一条文档,它的id是1.

PUT /customer/external/1?pretty
{
  "name": "John Doe"
}


成功后会返回

{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 1,
"result": "created",
"_shards":{
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

替换id为1的文档:

PUT /customer/external/1?pretty
{
  "name": "John Doe2"
}


创建文档时时,ID部分是可选的。如果未指定,Elasticsearch将生成一个随机ID,然后使用它来索引文档。

例如:

POST /customer/external/?pretty
{
  "name": "John Doe3"
}

请注意,在上述情况下,我们使用的是POST动词,而不是PUT,因为我们没有指定的ID。

重要的是要注意,Elasticsearch不需要先显式创建索引,然后才能将文档编入索引。在上一个示例中,Elasticsearch将自动创建客户索引(如果它尚未预先存在)。

让我们现在检索我们刚刚索引的文档:

http://localhost:9200/customer/external/1?pretty

{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "John Doe"
  }
}

_source字段,它返回我们从前面的步骤索引的完整JSON。

删除文档相当简单:

DELETE
http://localhost:9200/customer/external/1?pretty

删除索引:

DELETE
http://localhost:9200/customer

再次查看索引:

http://localhost:9200/_cat/indices?v

Elasticsearch提供近乎实时的数据操作和搜索功能。默认情况下,从索引/更新/删除数据到搜索结果中显示的时间,您可能需要一秒钟的延迟(刷新间隔)。这是与其他平台(如SQL)的重要区别,其中数据在事务完成后立即可用。

如果我们仔细研究上述命令,我们实际上可以看到我们如何在Elasticsearch中访问数据的模式。这种模式可以总结如下:

<REST Verb> / <Index> / <Type> / <ID>

api / 索引名 / 类型 / id

这种REST访问模式遍布所有的API命令,如果你可以简单地记住它,你将有一个良好的掌握Elasticsearch的开始。

相关文章

网友评论

      本文标题:ElasticSearch5.x研究日记2:索引与文档的基本操作

      本文链接:https://www.haomeiwen.com/subject/bdwobttx.html