2. ElasticSearch全文检索

1. 初步检索

1.1 _cat查看节点信息

_cat请求都为GET请求

1)/_cat/nodes:查看所有节点

2)/_cat/health:查看es健康状况

3)/_cat/master:查看主节点

4)/_cat/indices:查看所有索引 。类似mysql中的show databases

1.2 索引一个文档(保存数据)

要保存一条记录,就需要告诉ES要“保存在哪个索引的哪个类型下,指定用哪个唯一标识”

1)请求方式:PUT/POST

2)例如:给customer索引(数据库名)下的external类型(表名)下保存1(唯一标识)号数据为{"name":" Jone Deon "}

http://192.168.56.10:9200/customer/external/1

注意:返回的带 _ 的key称之为元数据

{
    "_index": "customer",	// 索引
    "_type": "external",	// 类型
    "_id": "1",		// 唯一标识
    "_version": 1,		// 版本
    "result": "created",	// 类型为创建
    "_shards": {		// 分片信息  集群的时候需要用到
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

用相同的URL,再次发送,如图:

类型就是updated更新了。因为1号数据已经存在了,所以是更新操作

注意:

1)POST新增。如果不指定id,会自动生成id,指定id就会修改这个数据,并新增版本号,如果指定的id不存在,那么类型就是created,_version值为1,再次用同样的URL发送,那么result就是updated,同时,_version+1

2)PUT可以新增可以修改,PUT必须指定id。由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错

1.3 查询文档(数据)

查询数据,只需要将POST/PUT改成GET即可,

例如:查询customer索引下的external类型下id为1的数据

{
    "_index": "customer",	// 在哪个索引
    "_type": "external",	// 在哪个类型
    "_id": "1",		// 记录id
    "_version": 2,		// 版本号
    "_seq_no": 1,		// 并发控制字段,每次更新就会+1,用来做乐观锁
    "_primary_term": 1,	// 同上,主分片重新分配,如重启,就会变化
    "found": true,		// 表示可以找到数据
    "_source": {		// 表示数据内容
        "name": " Jone Deon "
    }
}

注意:_seq_no与_primary_term可以用于并发控制,格式为

?if_seq_no=1&if_primary_term=1

例如:

用户A发送请求,修改数据,如图,修改成功

用户B用相同的URL访问,修改数据,修改不成功,如图:

1.4 更新文档(数据)

1.4.1 指定 _update 参数更新

发送POST请求,并指定 _update 

注意:注意请求体JSON格式

例如:http://192.168.56.10:9200/customer/external/1/_update

查询:

注意:该方式的更新,如果待更新的数据跟原数据一模一样,那么result=noop,且版本号_version不会+1,序列号_seq_no也不会改变

例如:

1.4.2 不带 _update 的更新

直接发送POST请求,例如:http://192.168.56.10:9200/customer/external/1

查询:

注意:该方式的更新,每一次更新都会让版本号与序列号+1

例如:

1.4.3 PUT更新

例如:http://192.168.56.10:9200/customer/external/1

1.4.4 更新的同时新增属性

更新的同时新增属性,使用 _update 更新,也可以使用不带_update的POST和PUT请求

例如:带_update的post请求

查询:

例如:不带 _update 的POST请求

注意:PUT更新与不到_update的post更新请求效果一样

总结:

1)POST请求带 _update 的更新,会对比元数据,如果没变化,就不进行操作

2)POST不带 _update 的更新与PUT更新,总会将数据重新保存并增加version版本

3)对于大并发更新,用不带_update的请求

4)对于大并发查询偶尔更新,用带_update的请求;对比更新,重新计算分配规则

1.5 删除文档&索引

删除需要使用DELETE请求

1.5.1 删除某一条数据

http://192.168.56.10:9200/customer/external/1

查询

1.5.2 删除文档(索引)

http://192.168.56.10:9200/customer

查询:

因为,索引已经删除了,所以,查询的时候,就会直接报错了

1.6 bulk批量API

1.6.1 在某个索引下 的某个类型下批量操作

请求:POST

URL:/索引(index)名/类型名/_bulk

语法格式:

{action:{metadata}}
{request body       }

{action:{metadata}}
{request body       }

一个大括号代表了一个操作

例如:http://192.168.56.10:9200/customer/external/_bulk

请求体:

{"index":{"_id":"1"}}
{"name":"Jone"}
{"index":{"_id":"2"}}
{"name":"Jack"}

1){"index":{"_id":"1"}}:index表示动作action,这里表示索引,索引就是保存操作,_id:1,表示给该条数据指定id

注意:action也可以是delete(删除)、create(创建)等

2){"name":"Jone"}:name表示要保存的数据

两行确定一条数据

注意:因为这里是多行数据,在postman中没办法测试,所以需要使用kibana

例如:

使用kibana批量操作

1)点击左下角的展开按钮,如图:

2)选择Dev Tools

3)在工具中输入命令,如图:

POST 表示发送的是post请求  后面紧跟着请求URI

下面跟着批量数据

4)点击绿色的三角,执行命令

如图:

注意:

took:表示花费了125ms

items:表示创建的数据集合,每一条数据都是独立操作存在的,某一条数据的失败,不会影响到其他数据的成功与否

1.6.2 对整个ES进行批量操作

请求:POST

URL:/_bulk

语法格式:

{action:{metadata}}
{request body       }

{action:{metadata}}
{request body       }

例如:http://192.168.56.10:9200/_bulk

// 删除操作:删除索引为website  类型为blog  id为123的数据
{"delete":{"_index":"website","_type":"blog","_id":"123"}}    

// 创建操作:创建索引为website  类型为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"}}    // 更新的真正的内容

在Kibana上执行如下图:

在上面的批量操作中,第一条语句是delete删除动作,但是,es中无此数据,所以bulk会返回该动作会失败,如图:

结论:bulk API 依次按顺序执行所有的action(动作),如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当bulk API返回时,它将提供每个动作的状态(与发送的顺序相同),所以,我们可以检查是否一个指定的动作是不是失败了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值