ElasticSearch(三)简单的增删改查
今天我们来讲一下ES的增删改查,这块内容有助于理解下周的SpringBoot集成ES的代码。
首先,我们先创建一个索引estest的索引,接下来要是都截图的话,阅读流畅性太低了,所以接下来会用简写的形式[请求类型 URL]。如下图。将简写为
PUT localhost:9200/estestRqeustBody:
{ "settings": { "number_of_shards": 1 }}
ResponseBody:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "estest"
}
然后我们向一个user的类型中添加一条数据。方式一,是让ES自动创建一个ID主键,如果我们要使用我们自己的主键,可以看看第二种方法。
方法一:POST localhost:9200/estest/user/
RqeustBody:
{
"name": "张三",
"age": 17,
"name_and_age": "张三17",
"is_man": true,
"birthday": "2019-01-01"
}
ResponseBody:
{
"_index":"estest",
"_type":"user",
"_id":"-plY_HABLAPQJei9q-lc", //返回ID 重点
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":0,
"_primary_term":1
}
方法二:
POST localhost:9200/estest/user/1 //重点,后面带来一个id值
RqeustBody:
{
"name": "李四",
"age": 17,
"name_and_age": "李四17",
"is_man": true,
"birthday": "2019-01-01"
}
ResponseBody:
{
"_index": "estest",
"_type": "user",
"_id": "1", //返回ID 重点
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
现在要删除李四这个人。我们使用DELETE请求,在索引和类型后面加ID就完事儿了。
DELETE localhost:9200/estest/user/1
但是,如果我们要删除指定名字的数据,比如说我们要删除张三的数据,可以使用下面的请求。
POST localhost:9200/estest/user/_delete_by_queryRqeustBody:
{
"query": {
"match": {
"name": "张三"
}
}
}
我们再次插入张三的数据。现在想更新一下张三的年龄,可以使用方法一,在索引和类型的后面加上_update_by_query,再在里添加查询条件。。想方法二是根据ID更新数据。
方法一:POST localhost:9200/estest/user/_update_by_query
RequestBody:
{
"script": {
"source":"ctx._source.age=18;"
},
"query": {
"match": {
"name":"张三"
}
}
}
方法二
POST localhost:9200/estest/user/_5lp_HABLAPQJei9cuke
RequestBody:
{
"birthday": "2019-01-01",
"name_and_age": "张三17",
"name": "张三",
"is_man": true,
"age": 18
}
终于,增删改结束,虽然只是介绍了一下简单的用法,我感觉已经累的不行了,吗呀,这个查询才是重点,可恶。
我们现在要查询张三这个用户,要咋查呢?
GET localhost:9200/estest/user/_searchRequestBody:
{
"query": {
"match": {
"name":"张三"
}
}
}
好了,重点终于,match,match啊。match的意思是匹配的意思,这个很有意思,因为ES里面有一个分词器,可以模糊匹配,现在我们放入一些其他的张三数据。可以看到名字为张三123123的匹配程度最低,只有0.12多,其他的为0.15。
那我们要是想精确匹配,可以使用trim。上一段介绍了一下分词系统,由于一开始没有给索引建立映射,ES自动把name字段进行了分词,导致我们无法精确匹配名字为张三的数据。所以改用age来测试term,虽然用match也会有一样的效果。match和term从文档上看,没啥子区别,match的适用范围更加广一些。
GET localhost:9200/estest/user/_searchRequestBody:
{
"query": {
"match": {
"age": 18
}
}
}
现在查询一下年龄大于15岁的人。由于是使用请求体的形式,所以不能用<,<=,>=,>这些符号,所以用这些来替代符号。
gt
大于
gte
大于等于
lt
小于
lte
小于等于
GET localhost:9200/estest/user/_searchRequestBody:
{
"query": {
"range": {
"age":{
"gt": 15
}
}
}
}
如果想查询一个字段是否为空,可以使用exists。missing在 ES5中已经被移除了。
GET localhost:9200/estest/user/_searchRequestBody:
{
"query": {
"missing": {
"field": "age"
}
}
}
终于写完了,这个ES的查询花了我两个晚上的时间,本来想周三的时候写完,然后今天看一下Spring Security源码,分析一下的,估计要拖到下周三了,我在这里骂一句DSL真难用!
以上是 ElasticSearch(三)简单的增删改查 的全部内容, 来源链接: utcz.com/z/514632.html