1 Index API简介

Index API可以把JSON文档新增或修改到指定的索引(Index)中,从而使该JSON文档能够被搜索到。下面举例在一个叫"dept"的索引(Index)中, 新增一个id为1的部门数据。

PUT /dept/_doc/1
{
  "name": "部门1",
  "code": "dept1"
}

上述操作结果如下:

{
  "_index" : "dept",//index的名称是dept
  "_type" : "_doc",//type的名称是_doc
  "_id" : "1",//指定id为1
  "_version" : 1,//数据版本号,如果上面put语句再执行一次,_version会+1
  "result" : "created",//created表明是新增操作,如果上面put语句再执行一次,就会是updated,表明是修改
  "_shards" : {
    "total" : 2,//表明应该有多少分片(包括主分片和副本分片)执行索引,这里2表明应该有一个主分片和一个副本分片
    "successful" : 1,//这里是1,因为我本机就启动了一个es节点,无有效的副本分片,只有1个主分片成功
    "failed" : 0//在副本分片上操作失败的数量,这里我本机没有副本分片,所以每一去在副本分片上操作,所以是0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

查询上面新增的数据

GET /dept/_doc/1

返回数据如下:
{
  "_index" : "dept",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "部门1",
    "code" : "dept1"
  }
}

2 操作类型

先说说ES里索引(index)这个概念,如果按照名词理解,它就是上面例子说的“dept”,相当于MySQL里的表名。如果按动词理解,就是上面的PUT操作,把数据索引(动词)到dept索引(名词)中。

index 解释
名词 相当于MySQL里的表名
动词 就是把数据保存到ES中

上面的索引(动词)操作也可接收一个op_type参数,可以指定op_type=create,表明这是新增数据操作,如果该数据(相同ID的数据)已经存在,则会保存失败。

PUT /dept/_doc/1?op_type=create
{
  "name": "部门1",
  "code": "dept1"
}

因为id=1的数据已经存在,所以会有document already exists这样提示的错误。

3 自生成ID

如果保存数据时,没有指定ID,而是希望ES自动生成ID,则可以用POST,此时默认为新增文档。

POST /dept/_doc/
{
  "name": "部门1",
  "code": "dept1"
}

查询所有数据,发现有2条数据,其中一个_id很长的是ES自生成的ID
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "dept",
        "_type" : "_doc",
        "_id" : "ciX_F28BLvC92eI0mEsx",
        "_score" : 1.0,
        "_source" : {
          "name" : "部门1",
          "code" : "dept1"
        }
      },
      {
        "_index" : "dept",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "部门1",
          "code" : "dept1"
        }
      }
    ]
  }

4 比较PUT和POST

在这里插入图片描述

5 获取文档和判断是否已经存在

GET pigg_blog/_doc/1

只获取_source
GET pigg_blog/_source/1

判断文档是否存在
HEAD pigg_blog/_doc/1

HEAD pigg_blog/_source/1

6 store属性的使用

创建一个index,设置name的store是true,那么name会在_source内和_source外都会保存一份,在_source外只是保存name的原始值。

PUT pigg_test_store
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "store": true
      },
      "age": {
        "type": "integer"
      },
      "address": {
        "type": "text"
      }
    }
  }
}

插入数据

PUT pigg_test_store/_doc/1
{
  "name": ["王石", "王磊"],
  "age": 33,
  "address": "江苏盐城盐都区"
}

查询数据

GET pigg_test_store/_doc/1?_source=true&stored_fields=name,age,address
返回如下:
{
  "_index" : "pigg_test_store",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 9,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : [
      "王石",
      "王磊"
    ],
    "age" : 33,
    "address" : "江苏盐城盐都区"
  },
  "fields" : {
    "name" : [
      "王石",
      "王磊"
    ]
  }
}

可以先参考Elasticsearch教程(一) DSL语句,学到update API时再整理详细内容。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐