前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch的CRUD

Elasticsearch的CRUD

作者头像
用户3467126
发布2020-02-25 12:00:36
4670
发布2020-02-25 12:00:36
举报
文章被收录于专栏:爱编码爱编码

前言

本文使用的Elasticsearch版本为6.5.4,上文主要介绍了它的Index(数据库)和Mapping(表结构),那么本文主要记录一下关于Elasticsearch的增删改以及普通查询操作。

ES的添加数据

语法:PUT /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键){ json数据 }

代码语言:javascript
复制
PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

注意事项:「ES在6.x版本调整了, 一个index只能存储一种type。」

即是说,在上面的添加数据完毕之后,再执行下面的代码,是会报错的。

代码语言:javascript
复制
PUT /ecommerce/product1/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

ES的修改数据

语法:POST /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键)/_update { 待修改的json数据 }

代码语言:javascript
复制
POST /ecommerce/product/1/_update
{
  "doc" : {
    "name" : "jiaqianban gaolujie yagao1"
  }
}

修改数据还有另外一种操作,就是覆盖,即是将数据重新添加到该document下实现替换操作。如下:

代码语言:javascript
复制
PUT /ecommerce/product/1
{
  "name" : "jiaqiangban gaolujie yagao",
  "desc" : "gaoxiao meibai",
  "price" : 30,
  "producer" : "gaolujie producer",
  "tags" : [ "meibai" , "fangzhu" ]
}

「需要注意事项:」

1.「document是不可变的」,如果要修改document的内容,可以通过全量替换,直接对document重新建立索引,替换里面所有的内容。

2.es会将老的document标记为deleted(逻辑删除),然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除(物理删除)标记为deleted的document。

3.「替换必须带上所有的field,否则其他数据会丢失。」

ES的删除数据

语法:DELETE /Index名(数据库)/Type名(即表名)/Document名(一条记录的主键)

代码语言:javascript
复制
DELETE /ecommerce/product/2

注意:在删除一个document之后,我们可以从侧面证明,它不是立即物理删除的,因为它的一些版本号信息还是保留的。

ES的基本查询

1、查询ES中所有的数据:
代码语言:javascript
复制
GET /_search

返回结果如下:

「结果参数含义解析如下:」

1)took:耗费了几毫秒

2)timed_out:是否超时,false是没有,默认无timeout

3)_shards:shards fail的条件(primary和replica全部挂掉),不影响其他shard。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard上去。

4)hits.total:本次搜索,返回了几条结果

5)hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高

6)hits.hits:包含了匹配搜索的document的详细数据,默认查询前10条数据,按_score降序排序

7)hits.hits._index:Index名称(即数据库名)

8)hits.hits._type:Type名称(即表名)

9)hits.hits._id:Document名称(即行主键)

10)hits.hits._score:评分,(评分越高,表示匹配当前搜索越相关)

11)hits.hits._source:源数据,(添加的Json数据)

2、查询某数据表(Type)的所有记录
代码语言:javascript
复制
GET /ecommerce/product/_search
{
  "query" : {
    "match_all" : {}
  }
}
### 其实这两种是一样的,因为ES在6.x版本调整了, 一个index只能存储一种type。
GET /ecommerce/_search
{
  "query" : {
    "match_all" : {}
  }
}
3、查询并排序
代码语言:javascript
复制
## 查询名称包含yaogao的商品,同时按照价格降序排列
GET /ecommerce/product/_search
{
  "query" : {
    "match" : {
      "name" : "yagao"
    }
  },
  "sort" : [
    { "price" : "desc"}
    ]
}

4、分页查询
代码语言:javascript
复制
#总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品
GET /ecommerce/product/_search
{
  "query" : { "match_all" : {}},
  "from" : 1,
  "size" : 1
}
5、指定返回某项(列)
代码语言:javascript
复制
GET /ecommerce/product/_search
{
  "query" : {"match_all" : {}},
  "_source" : ["name", "price"]
}
6、过滤查询
代码语言:javascript
复制
#搜索商品名称包含yaogao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
  "query" : {
    "bool" : {
      "must" : {
        "match" : {
          "name" : "yagao"
      }
  },
  "filter" : {
    "range" : {
      "price": {"gt" : 25}
        }
      }
    }
  }
}
7、search(全文检索)
代码语言:javascript
复制
GET /ecommerce/product/_search
{
  "query" : {
    "match" : {
      "producer": "yagao producer"
    }
  }
}
8、短语搜索
代码语言:javascript
复制
GET /ecommerce/product/_search
{
  "query" : {
    "match_phrase" : {
      "producer" : "yagao producer"
    }
  }
}

full-text search (全文检索)和 phrase search(短语搜索)的区别:

全文检索:会将输入的搜索串拆解开来,去索引里面去一一匹配,只要能匹配任意一个拆解后的单词,就可以作为结果返回。phrase search:要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配成功,才能作为结果返回。

9、多条件查询
代码语言:javascript
复制
## 名字中有yagao,描述上可以有fangzhu也可以没有,价格不能是25元
GET /ecommerce/_search
{
  "query" : {
    "bool" : {
      "must" : [
        {
          "match" : {
            "name" : "yagao"
          }
        }
        ],
        "should" : [
          {
            "match" : {
              "desc" : "fangzhu"
            }
          },
          {
            "match" : {
              "desc" : "caoben"
            }
          }
          ],
          "must_not" : [
            {
              "match" : {
                "price" :25
              }
            }
          ],
          "minimum_should_match" : 1
    }
  }
}

多条件查询中的字段描述:

must:  表示一定要满足;

should:  表示可以满足也可以不满足;

must_not:  表示不能满足该条件;

minimum_should_match:1 :表示最小匹配度,可以设置为百分之百,设置了这个值的时候就必须满足should里面的设置了,

另外注意这边should里面同一字段设置的多个值,意思是当这个值等于X或者等于Y都成立,务必注意格式。

总结

以上是对Elasticsearch的简单的增删改查做了一点点总结。简单的逻辑足够,但是有些需求需要比较复杂的查询,我们下次再学。

参考文章

https://www.cnblogs.com/liuqijia/p/11507494.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • ES的添加数据
  • ES的修改数据
  • ES的删除数据
  • ES的基本查询
    • 1、查询ES中所有的数据:
      • 2、查询某数据表(Type)的所有记录
        • 3、查询并排序
          • 4、分页查询
            • 5、指定返回某项(列)
              • 6、过滤查询
                • 7、search(全文检索)
                  • 8、短语搜索
                    • 9、多条件查询
                    • 总结
                    • 参考文章
                    相关产品与服务
                    Elasticsearch Service
                    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档