ES-文档增删改查及局部更新

1,490 阅读3分钟

文档,即索引库中的数据,会根据规则创建索引,将用于搜索。可以类比做关系型数据库中的一行数据。

新增文档

新增文档时,涉及到id的创建方式,手动指定或者自动生成。

PUT /test_index //创建索引

{

  "settings": {},
  "mappings": {
    "properties": {
      "name":{//企业名称
        "type":"text",
        "index": true,
        "store": false,
        "analyzer": "ik_max_word"
      },
      "job":{//岗位
        "type":"text",
        "index": true,
        "store": false,
        "analyzer": "ik_max_word"
      },
      "payment":{//薪资
        "type":"float",
        "index": true,
        "store": false
      },
      "logo":{//企业logo地址
        "type":"text",
        "index": false,
        "store": false
      }
    }
  }
}

手动指定id

//语法-手动指定
POST /索引名称/_doc/{id}
{
    "field":"value"
}

//示例
POST /test_index/_doc/1
{
  "name":"百度",
  "job":"小度用户运营经理",
  "payment":"30000",
  "logo":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
}

自动生成id

//语法
POST /索引名称/_doc
{
    "field":"value"
}

//示例
POST /test_index/_doc/
{
  "name":"百度",
  "job":"算法工程师",
  "payment":"50000",
  "logo":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
}

可以看到结果显示为:created,代表创建成功。 响应结果中的_id字段,就是这条文档数据的唯一标识,以后增删改查都依赖这个_id作为唯一标识。

查看单个文档

//语法
GET /索引名称/_doc/{id}

//示例
GET /test_index/_doc/1

//返回
{
  "_index" : "test_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "百度",
    "job" : "小度用户运营经理",
    "payment" : "30000",
    "logo" : "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
  }

}

文档元素解读

元数据项含义
_indexdocument所属index
_typedocument所属type,Elasticsearch7.x默认type为_doc
_id代表document的唯一标识,与index和type一起,可以唯一标识和定位一个ducument
_versiondocument的版本号,Elasticsearch利用_version(版本号)的方式来确保应用中相互冲突的变更不会导致数据丢失。需要修改数据时,需要指定想要修改文档的版本号,如果该版本不是当前版本号,请求将会失败。
_seq_no严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的doc的seq_no大于先写入的doc的seq_no
_primary_term任何类型的写操作,包括index、create、update和delete,都会生成一个_primary_term
foundtrue/false,是否查找到文档
_source存储原始文档

查看所有文档

//语法
POST /索引名称/_search
{
    "query":{
        "match_all":{}
    }
}

_source定制返回结果

某些业务场景下,我们不需要搜索引擎返回source中的所有字段,可以使用source进行定制,如下多个字段之间使用逗号分隔

//语法
GET /索引名称/_doc/{id}?_source=字段1,字段2

//示例
GET /test_index/_doc/1?_source=name,job

更新(全部更新)

全部更新:修改请求时传什么参数,修改后文档则有哪些参数,如修改前有name、job、payment、log,修改时只传了前三个字段,那么修改后的文档就只有前三个字段。

//语法
PUT /索引名称/_doc/{id}
{
    "field":"value"
}

注意:id对应的文档存在时,则修改。id对应的文档不存时,则新增。

比如,使用id为2,不存在,则应该是新增

//示例
PUT /test_index/_doc/2
{
  "name":"百度",
  "job":"Linux工程师",
  "payment":"10000",
  "logo":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
}

再次执行刚才的请求,把数据改一下

PUT /test_index/_doc/2
{
  "name":"百度",
  "job":"Linux工程师",
  "payment":"15000",
  "logo":"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
}

result返回为update,修改。

注意在使用PUT或者POST对文档进行更新的时候,Elasticsearch首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立刻消失,但是也无法访问,Elasticsearch会在继续添加更多数据的时候在后台清理已经标记为删除状态的文档。

更新(局部更新)

局部更新:只是修改某个字段(使用POST)

//语法
POST /索引名称/_update/{id}
{
    "doc":{
        "field":"value"
    }
}



//示例
POST /test_index/_update/oV_XyoABEcrwon4BYhbZ
{
  "doc":{
    "job":"AI算法工程师"
  }
}

删除文档

  • 根据id删除

//语法
DELETE /索引名称/_doc/{id}

//示例
DELETE /test_index/_doc/2

  • 根据查询条件删除

//语法
POST /索引名称/_delete_by_query
{
    "query":{
        "match":{
            "字段名":"搜索关键字"
        }
    }
}



//示例

POST /test_index/_delete_by_query
{
  "query":{
    "match":{
      "job":"小度用户运营经理"
    }
  }
}

  • 删除所有

//语法

POST /索引名称/_delete_by_query
{
    "query":{
        "match_all":{}
    }
}



//示例
POST /test_index/_delete_by_query
{
  "query":{
    "match_all":{}
  }
}