ElasticSearch5.X 增删改查

梦里梦外; 2022-06-07 10:20 374阅读 0赞

ES支持近实时的索引、更新、查询、删除文档,近实时就意味着刚刚索引的数据需要1秒钟后才能搜索到,这也是与传统的SQL数据库不同的地方。

索引/替换文档

之前已经试过如何索引一个文档了,这里再复习一下:

  1. curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  2. {
  3. "name": "John Doe"
  4. }'

上面的例子中,创建了一个索引为customer,类型为external,id为1的文档。

当再次执行命令:

  1. curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  2. {
  3. "name": "Jane Doe"
  4. }'

之前的第一个文档就被覆盖掉了。

如果指定新的文档id,那么旧的文档仍然存在:

  1. curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
  2. {
  3. "name": "Jane Doe"
  4. }'

索引的时候ID是可选的,如果不指定ID,ES会随机生成一个ID,并使用这个ID索引文档数据。

  1. curl -XPOST 'localhost:9200/customer/external?pretty' -d '
  2. {
  3. "name": "Jane Doe"
  4. }'

需要注意的是,如果不指定ID,那么需要使用POST命令,而不是PUT。

更新文档

除了索引和替换文档,ES还支持更新文档。更新文档其实是先删除旧的文档,再索引新的文档。

如果想要更新文档内容,可以按照下面的方式进行:

  1. curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  2. {
  3. "doc": { "name": "Jane Doe" }
  4. }'

由于是先删除再索引,因此可以额外增加新的字段:

  1. curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  2. {
  3. "doc": { "name": "Jane Doe", "age": 20 }
  4. }'

当然也支持使用脚本进行更新:

  1. curl -XPOS
  2. T 'localhost:9200/customer/external/1/_update?pretty' -d '
  3. {
  4. "script" : "ctx._source.age += 5"
  5. }'

其中ctx._source代表了当前的文档,上面的意思 是 在当前文档的基础上age加5.

删除文档

删除文档就很简单了,只需要指定文档的索引、类型、ID就行了:

  1. curl -XDELETE 'localhost:9200/customer/external/2?pretty'

搜索

  1. curl -XGET 'localhost:9200/customer/external/_search' -d '
  2. {
  3. "query": {
  4. "match": {
  5. "name":"wang"
  6. }
  7. }
  8. }'

执行搜索

GET查询

Get API允许基于ID字段从Elasticsearch查询JSON文档,下面就是一个查询的例子:

  1. curl -XGET 'http://localhost:9200/twitter/tweet/1'

上面的命令表示,在twitter索引的tweet类型中查询id为1的文档,返回结果如下:

  1. {
  2. "_index" : "twitter",
  3. "_type" : "tweet",
  4. "_id" : "1",
  5. "_version" : 1,
  6. "found": true,
  7. "_source" : {
  8. "user" : "kimchy",
  9. "postDate" : "2009-11-15T14:12:12",
  10. "message" : "trying out Elasticsearch"
  11. }
  12. }

上面返回的数据包括文档的基本内容,_index是索引名称,_type是类型,_id是ID,_version是版本号。_source字段包括了文档的基本内容;found字段代表是否找到。

这个API支持使用HEAD方式提交,这样可以验证这个ID是否存在,而不会返回无用的数据。

  1. curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'

批量操作

除了索引、替换、更新和删除,ES为了减少来回的响应信息,可以一次性执行多个命令,最后统一返回执行结果。

例如:

复制代码

  1. curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  2. {
  3. "index":{
  4. "_id":"1"}}
  5. {
  6. "name": "John Doe" }
  7. {
  8. "index":{
  9. "_id":"2"}}
  10. {
  11. "name": "Jane Doe" }
  12. '

复制代码

上面的命令可以同时插入两条数据。

_bulk命令不仅仅支持单个命令执行多条,还只是多种不同的命令执行多条。

  1. curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  2. {
  3. "update":{
  4. "_id":"1"}}
  5. {
  6. "doc": { "name": "John Doe becomes Jane Doe" } }
  7. {
  8. "delete":{
  9. "_id":"2"}}
  10. '

上面的命令中,先更新id为1的文档,再删除id为2的文档。

如果bulk中的某一个命令执行出错,那么会继续执行后面的命令,最后在命令返回时,会返回每个命令的执行结果。

发表评论

表情:
评论列表 (有 0 条评论,374人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ElasticSearch5.X 增删

    ES支持近实时的索引、更新、查询、删除文档,近实时就意味着刚刚索引的数据需要1秒钟后才能搜索到,这也是与传统的SQL数据库不同的地方。 索引/替换文档 之前已经试过

    相关 Elasticsearch增删

    Elasticsearch的增删改查: 面向文档 document数据格式 1. 应用系统的数据结构都是面向对象的,复杂的 2. 对象数据存储到数据库中,只能拆

    相关 Elasticsearch增删

    面向文档 document数据格式 1. 应用系统的数据结构都是面向对象的,复杂的 2. 对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得