前言
本文使用的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