目录
一、ES相关命令
PUT 类似于SQL中的增
DELETE 类似于SQL中的删
POST 类似于SQL中的改
GET 类似于SQL中的查
新增名为index_first索引库
PUT index_first
查询ES中所有的索引库
GET _cat/indices
删除名为index_first索引库
DELETE index_first
二、ES的CRUD操作
插入一条商品数据
product为库名,phone为表名,1为一条数据的id,不指定type默认为_doc。
PUT /product/phone/1
{
"name" : "苹果14proMax",
"desc" : "苹果手机双十一大促销,立减1000元!!!",
"price" : "7999",
"business" : "apple store",
"tags" : ["shuma","dianzi"]
}
使用指定id查询商品数据
GET product/phone/1
删除商品索引库
DELETE product
修改商品数据PUT方法(全局更新)
使用put方法就相当于将之前的数据删除,将新的数据添加上去 。
PUT /product/phone/1
{
"desc" : "使用put修改之后的数据!"
}
修改商品数据POST方法(局部更新)
使用POST方法只修改指定的字段
POST /product/phone/1/_update
{
"doc" :{
"desc" : "这是使用post修改的数据!"
}
}
查看数据:
查看所有数据
相当与全表扫描
GET /product/_search
took:耗费了523毫秒
shards:分片的情况
hits:获取到的数据的情况
total: 总的数据条数
max_score:所有数据里面打分最高的分数
_index: "product" index名称
_type: "phone" type的名称
_id:"2" id号
_score: 分数,这个分数越大越靠前出来,也就是匹配度越高越靠前
再添加两条数据,用于后面的测试
PUT /product/phone/2
{
"name" : "苹果14",
"desc" : "苹果手机双十一大促销,立减1000元!!!",
"price" : "4999",
"business" : "apple store",
"tags" : ["shuma","dianzi"]
}
PUT /product/phone/3
{
"name" : "华为P40",
"desc" : "华为手机双十一大促销,立减999元!!!",
"price" : "5999",
"business" : "huawei store",
"tags" : ["shuma","dianzi"]
}
三、使用DSL语言
查询所有商品
使用match_all查询全部
GET /product/_search
{
"query": {
"match_all": {
}
}
}
条件查询
使用match可进行模糊或精准查询
GET /product/_search
{
"query": {
"match": {
"name" : "苹果14"
}
}
}
查询效果如下
按照价格排序
使用 sort ,排序字段为text类型的会报错,设置为keyword类型,这里在语法中设置,可以在创建的时候将属性设置为keyword类型。
GET /product/phone/_search
{
"query": {
"match": {
"name" : "苹果14"
}
},
"sort": [
{
"price.keyword": {
"order": "desc"
}
}
]
}
效果如下,商品根据价格进行倒序排序:
实现分页查询
from 从第几页开始,size每页数据条数
GET /product/phone/_search
{
"query": {
"match": {
"name" : "苹果14"
}
},
"sort": [
{
"price.keyword": {
"order": "desc"
}
}
],
"from": 0,
"size": 1
}
设置为从第0页开始,每页一条数据,效果如下图:
返回指定字段的所有数据
使用_source实现,他和query平级
GET /product/phone/_search
{
"query": {
"match_all": {
}
},
"_source": ["name","price"]
}
只查出所有数据的名称和价格字段,效果如下:
多个查询条件(bool )
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:
must: 多个查询条件的完全匹配,相当于 and。
must_not : 多个查询条件的相反匹配,相当于 not。
should :至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组
操作:查询名称里带有苹果的,并且价格大于6000元的数据
GET /product/phone/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name" : "苹果"
}
}
],
"filter": [
{
"range":{
"price" : {
"gt" : "6000"
}
}
}
]
}
}
}
使用 filter 操作符进行过滤,它包含的操作符 range 代表范围,其中"gt"为大于号,"lt"为小于号,查询效果如下,只有一个数据,因为另一个名字带苹果的价格小于6000元:
不分词,精确匹配(match_phrase)
操作:查询名字为苹果14的商品
GET /product/phone/_search
{
"query": {
"match_phrase": {
"name": "苹果14"
}
}
}
如图,只查到了苹果14:
查询结果高亮显示 (highlight)
使用highlight,和query平级
查询名字中带苹果14的商品,并高亮显示
GET /product/phone/_search
{
"query": {
"match": {
"name": "苹果14"
}
},
"highlight": {
"fields": {
"name" : {}
}
}
}
高亮显示的字段会被<em></em>包裹,可以修改高亮显示的效果,查询结果如下:
四、聚合分析
计算每个标签tag下商品的数量
terms 允许指定多个匹配条件,group_by_tag为自定义名称
注意:聚合的字段必须为keyword类型,如果是text类型的会报错
GET /product/phone/_search
{
"aggs": {
"group_by_tag": {
"terms": {
"field": "tags"
}
}
}
}
效果如下
查询商品名称里包含苹果的,并计算每个tags下商品的数量
GET /product/phone/_search
{
"query": {
"match": {
"name": "苹果"
}
},
"aggs": {
"group_by_tag": {
"terms": {
"field": "tags"
}
}
}
}
效果如下
设置索引类型
为了防止因为不是keword类型进行聚合错做而报错,重新创建并设置类型
PUT /product2
{
"mappings": {
"properties": {
"name":{
"type":"text"
},
"price":{
"type":"keyword"
}
}
}
}
设置完类型之后,进行赋值,使用put方法,上面演示过了,这里跳过。
查看映射
GET product2/_mapping
查看刚刚创建的索引映射,效果如下,可以看到name的类型为text,price的类型为keword