28.ElasticSearch进阶

发布时间 2023-04-02 22:19:03作者: lucsa

两种查询方式

在将所有的检索条件全部放在url里

GET bank/_search?q=*&sort=account_number:asc    表示在banK索引下查询所有文档根据account_number正序

 

 hits里有10条数据,总数是1000,可以看出ES默认做了分页。

我们以 /_cat/health 为例试一下:

索引一个文档(保存)

保存一条数据到哪个索引的哪个类型下,使用如下命令:

PUT /customer/external/1   在customer索引下的external类型下保存一条id为1的数据
数据可以如下所示:
{
  "name":"BianEn"
}

其实POST和PUT都可以,

POST新增如果不指定id,会自动生成id,指定id会修改这个id数据,并新增版本号。

PUT可以新增可以修改,新增修改都必须指定id,不指定id会报错,我们一般使用PUT的方式。

 我们再修改id为1的数据试试:

查询文档

GET /customer/external/1   查询customer索引下的external类型下id为1的数据

 怎么使用_seq_no来控制并发呢?

?if_seq_no=1   _primary_term也同理,如?if_seq_no=1&if_primary_term

我们模拟两次更新请求,第一次肯定可以,因为上面我们查询了_seq_no就是1,第二次请求肯定失败了,因为被第一次改了_seq_no的值会变化不再是1:

第一次:成功

第二次:失败

更新文档

除了前面新建文档时候也可以更新文档意外ES还提供了单独更新的接口:

POST /customer/external/1/_update   与新建文档的方式更新文档不同的地方是这个方式更新相同的值version和seq_no都不会增加

{
  "doc":{
       "name":"测试更新"
   }
}
可以看到更新的json数据多了一层doc

删除文档

DELETE /customer/external/1
还可以删除索引 DELETE /customer
但是不支持删除类型

Bulk批量

在索引下的类型下做批量操作

POST  /customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"张三"}
{"index":{"_id":"2"}}
{"name":"李四"}

表示在customer索引下的external类型保存两条文档:(上面这个数据不是个正经的JSON,PostMan就没办法测试了,我们使用Kibana测试)

在整个ES下做批量操作

POST  /_bulk

{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title":"my first blog post"}
{"index":{"_index":"website","_type":"blog"}}
{"title":"my second blog post"}
{"update":{"_index":"website","_type":"blog","_id":"123"}}
{"doc":{"title":"my updated blog post"}}