索引并查询一个文档

现在让我们放一些东西到topics索引中。首先要知道的是,为了索引一个文档,我们必须告诉Elasticsearch这个文档要到这个索引的哪个类型(type)下。

让我们将一个简单的客户文档索引到topics索引、“external”类型中,这个文档的ID是1,操作如下:

    curl -XPUT 'localhost:9200/topics/external/1?pretty' -d '
    {
      "name": "John Doe"
    }'

响应如下:

    curl -XPUT 'localhost:9200/topics/external/1?pretty' -d '
    {
      "name": "John Doe"
    }'
    {
      "_index" : "topics",
      "_type" : "external",
      "_id" : "1",
      "_version" : 1,
      "created" : true
    }

从上面的响应中,我们可以看到,一个新的客户文档在topics索引和external类型中被成功创建。文档也有一个内部id 1, 这个id是我们在索引的时候指定的。

有一个关键点需要注意,Elasticsearch在你想将文档索引到某个索引的时候,并不强制要求这个索引被显式地创建。在前面这个例子中,如果topics索引不存在,Elasticsearch将会自动地创建这个索引。

现在,让我们把刚刚索引的文档取出来:

    curl -XGET 'localhost:9200/topics/external/1?pretty'

响应如下:

    curl -XGET 'localhost:9200/topics/external/1?pretty'
    {
      "_index" : "topics",
      "_type" : "external",
      "_id" : "1",
      "_version" : 1,
      "found" : true, "_source" : { "name": "John Doe" }
    }

除了一个叫做found的字段来指明我们找到了一个ID为1的文档,和另外一个字段——_source——返回我们前一步中索引的完整JSON文档之外,其它的都没有什么特别之处。
删除一个文档

现在让我们删除我们刚刚创建的索引,并再次列出所有的索引:

    curl -XDELETE 'localhost:9200/topics?pretty'
    curl 'localhost:9200/_cat/indices?v'

响应如下:

    curl -XDELETE 'localhost:9200/topics?pretty'
    {
      "acknowledged" : true
    }
    curl 'localhost:9200/_cat/indices?v'
    health index pri rep docs.count docs.deleted store.size pri.store.size

这表明我们成功地删除了这个索引,现在我们回到了集群中空无所有的状态。

再次,以上的命令将会把这个文档索引到customer索引、external类型中,其ID是1。如果我们对一个不同(或相同)的文档应用以上的命令,Elasticsearch将会用一个新的文档来替换(重新索引)当前ID为1的那个文档。 curl -XPUT ‘localhost:9200/customer/external/1?pretty’ -d ’ { “name”: “Jane Doe” }’ 以上的命令将ID为1的文档的name字段的值从“John Doe”改成了“Jane Doe”。如果我们使用一个不同的ID,一个新的文档将会被索引,当前已经在索引中的文档不会受到影响。 curl -XPUT ‘localhost:9200/customer/external/2?pretty’ -d ’ { “name”: “Jane Doe” }’ 以上的命令,将会索引一个ID为2的新文档。 在索引的时候,ID部分是可选的。如果不指定,Elasticsearch将产生一个随机的ID来索引这个文档。Elasticsearch生成的ID会作为索引API调用的一部分被返回。 以下的例子展示了怎样在没有指定ID的情况下来索引一个文档: curl -XPOST ‘localhost:9200/customer/external?pretty’ -d ’ { “name”: “Jane Doe” }’ 注意,在上面的情形中,由于我们没有指定一个ID,我们使用的是POST而不是PUT。