ElasticSearch常用语法大全
本文,本文重在扫盲,从简单的添加索引、创建mapping、增、删、改、查、分页、聚合、嵌套查询等常用的语法切入,把大家带入到Elastic search的使用,让我们对es有个大概的体感。
目录
一、添加索引
二、设置mapping
属性映射类型可参考:
示例
三、插入数据
四、查询数据
以上mapping的设置,涵盖了四种常用的数据类型。对每种数据类型查询做下分析
1.简单数据类型:如上述示例中的goodsId,goodsName
2.对于type为long,数组形式存储的但属性值的查询。如上述示例中的buIds,主要为java对象中List buIds 的用法
3.object类型和nested类型的查询(上述示例中的manager和managers)
五、更新索引
1.通过put插入索引的方式,指定id后,把要改的字段,全都写一遍,重新进行索引,如果是新增的字段,如果索引模式设置了自动适配就会新增该字段(默认是新增)。相同的字段进行更新,缺少的字段更新为空
2.通过update by query语句进行更新,示例如下
六.删除语句 delete by query 语句进行,务必要加条件,不然会删除所有数据,慎用
七、分页
八、聚合
一、添加索引
语法:PUT 你的索引名称
示例:PUT goods_for_test_use
二、设置mapping
属性映射类型可参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
示例
PUT goods_for_test_use/goods_for_test/_mapping
{"properties": {"goodsId":{"type": "keyword"},"goodsName":{"type": "keyword"},"buIds":{"type": "long"},"gmv":{"type": "double"},"manager":{"type": "object","properties": {"firstName":{"type":"keyword"},"secondName":{"type":"keyword"},"age":{"type":"long"}}},"managers":{"type": "nested","properties": {"firstName":{"type":"keyword"},"secondName":{"type":"keyword"},"age":{"type":"long"}}}}
}
三、插入数据
插入数据,只要根据mapping设置的数据类型,组装相应的json串即可,见示例代码
##插入数据第一条数据,这里的1表示的是索引中文档的id,可根据业务语义设置即可,如使用商品id
PUT goods_for_test_use/_doc/1
{"goodsId":"222","goodsName":"测试商品名称2","buIds":[1,2,3],"gmv":333,"manager":[{"firstName":"lei","secondName":"teng"},{"fistName":"zhang","secondName":"san"}],"managers":[{"firstName":"lei","secondName":"teng","age":30},{"firstName":"zhang","secondName":"san","age":18},{"firstName":"lei","secondName":"san","age":18}]
}
四、查询数据
以上mapping的设置,涵盖了四种常用的数据类型。对每种数据类型查询做下分析
1.简单数据类型:如上述示例中的goodsId,goodsName
## 查询goodsId 为goodsId222 且商品名称为测试商品名称2的数据
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"match": {"goodsId": "goodsId222"}},{"match": {"goodsName": "测试商品名称2"}}]}}
}
2.对于type为long,数组形式存储的但属性值的查询。如上述示例中的buIds,主要为java对象中List<Long> buIds 的用法
## 注意,单属性数组形式存储的数据,使用terms查询,代表in的意思,不能使用term(等值查询)
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"terms": {"buIds": ["1","5"]}}]}}
}
3.object类型和nested类型的查询(上述示例中的manager和managers)
在示例中:manager 属性type类型为object,插入的两个对象为管理者一:
firstName:lei
secondName:teng
管理者二:
firstName:zhang
secondName:san
managers 属性类型为nested,插入的三个管理这对象为管理者一:
firstName:lei
secondName:teng
管理者二:
firstName:zhang
secondName:san
管理者三:
firstName:lei
secondName:san
现在如果我们要查询管理者firstName="lei"并且secondName="san"的商品记录,如果manager属性为object类型,则查询时,即使没有名字叫lei、san的管理者,但是也会把记录匹配出来。
## object 类型的对象查询
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"match": {"manager.firstName": "lei"}},{"match": {"manager.secondName": "san"}}]}}
}
## 查询到的结果
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.3862944,"hits" : [{"_index" : "goods_for_test_use","_type" : "goods_for_test","_id" : "2","_score" : 1.3862944,"_source" : {"goodsId" : "goodsId222","goodsName" : "测试商品名称2","buIds" : [1,2,3],"manager" : [{"firstName" : "lei","secondName" : "teng"},{"fistName" : "zhang","secondName" : "san"}],"managers" : [{"firstName" : "lei","secondName" : "teng","age" : 30},{"fistName" : "zhang","secondName" : "san","age" : 18},{"fistName" : "lei","secondName" : "san","age" : 18}]}}]}
}
发生这种情况的原因是因为,type为object类型在elastic内部存储类似如下:
{"goodsId" : "goodsId222","goodsName" : "测试商品名称2","manager.firstName" : [ "lei", "zhang" ]"manager.secondName": ["teng","san]
}
- manager 为object 类型,内部存储结构被扁平化为多值字段,类似示例中的buIds,因此可以查询到lei、san的管理者数据,这是不满足查询语义的。
- 因此如果为了保障各对象的相对独立性,需要采用managers的方式,定义类型为nested,其内部是作为独立对象存储的,可以用于查询等操作,具体查询语句如下
GET goods_for_test_use/_search
{"query": {"nested": {"path": "managers","query": {"bool": {"must": [{"match": {"managers.firstName": "lei"}},{"match": {"managers.secondName": "san"}}]}}}}
}
执行以上嵌套查询,就可以查到真实的姓名leisan的数据了,因为确实存储了。
五、更新索引
1.通过put插入索引的方式,指定id后,把要改的字段,全都写一遍,重新进行索引,如果是新增的字段,如果索引模式设置了自动适配就会新增该字段(默认是新增)。相同的字段进行更新,缺少的字段更新为空
PUT goods_for_test_use/_doc/1
{"goodsId":"111","goodsName":"测试商品名称1","buIds":[1,2,3],"manager":[{"firstName":"heh","secondName":"teng"},{"fistName":"zhang","secondName":"san"}],"managers":[{"firstName":"lei","secondName":"teng","age":30},{"firstName":"zhang","secondName":"san","age":18},{"firstName":"lei","secondName":"san","age":18}]
}
2.通过update by query语句进行更新,示例如下
POST goods_for_test_use/_update_by_query
{"script":{"source":"ctx._source['goodsName']='雷腾测试商品';ctx._source['buIds']=[1,2,4]"},"query":{"bool":{"must":[{"match":{"goodsId":"111"}}]}}
}
六.删除语句 delete by query 语句进行,务必要加条件,不然会删除所有数据,慎用
POST goods_for_test_use/_delete_by_query
{"query":{"bool":{"must":[{"match":{"goodsId":"111"}}]}}
}
七、分页
GET goods_for_test_use/_search
{"from": 0,"size": 20
}
八、聚合
1.agg terms分桶,类似于sql中的group by; agg 各种指标函数,类似于sql中的sum、avg、max、min等。并且可以联合使用
示例如下
## 查询语句,统计每个商品的gmv综合
GET goods_for_test_use/_search
{"aggs": {"商品id": {"terms": {"field": "goodsId","size": 10}, "aggs": {"总的gmv": {"sum": {"field": "gmv"}}}}},"size": 0
}
## 查询的结果
{"took" : 7,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : 6,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"商品id" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "111","doc_count" : 3,"总的gmv" : {"value" : 765.0}},{"key" : "222","doc_count" : 3,"总的gmv" : {"value" : 999.0}}]}}
}
ElasticSearch常用语法大全相关推荐
- shell脚本常用语法大全
shell脚本常用语法大全 一.shell简介 二.shell常用命令 2.1echo 2.2printf 2.3test 三.shell变量 3.1变量命名规则 3.2赋值方式 3.3使用变量 3. ...
- Markdown常用语法大全
Markdown学习 目录 目录创建方式:[TOC]是Table Of Contents的缩写 文章目录 Markdown学习 目录 标题 字体 引用 分割线 插入图片 超链接 列表 有序列表 无序列 ...
- sqlserver常用语法大全
查看锁表 SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName FROM sys.dm_ ...
- 【自用】【持续更新】LaTeX常用基础语法大全
目录 LaTeX常用基础语法大全 段落 居中 排序列表 文本.变量 加粗 斜体 向量(顶有向量箭头→) 估计(顶有尖头hat) 平均(顶有横线) 顶有波浪号~ 24个希腊字母 花体.集合手写体 大型运 ...
- python常用代码大全-Python常用库大全
Python常用库大全,看看有没有你需要的. 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具 ...
- python代码库-Python常用库大全
Python常用库大全,看看有没有你需要的. 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具 ...
- Ubuntu常用命令大全[显示桌面]
Ubuntu常用命令大全 查看软件xxx安装内容 #dpkg -L xxx 查找软件 #apt-cache search 正则表达式 查找文件属于哪个包 #dpkg -S filename apt-f ...
- javascript常用代码大全
http://caibaojian.com/288.html 原文链接 jquery选中radio//如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...
- Hive常用函数大全一览
Hive常用函数大全一览 1 关系运算 1.1 1.等值比较: = 1.2 2.不等值比较: 1.3 3.小于比较: < 1.4 4.小于等于比较: <= 1.5 5.大于比较: > ...
- 嵌入式linux基本指令,成都嵌入式开发之Linux常用命令大全
原标题:成都嵌入式开发之Linux常用命令大全 Linux系统中有很多命令,使用Linux系统最常用的就是命令操作,而不是像Windows一样,使用鼠标操作.Linux中许多常用命令是必须掌握的,也有 ...
最新文章
- Windows环境下的NodeJS+NPM+Bower安装配置
- 王者荣耀全栈项目部署到阿里云服务器笔记
- phpshe b2c商城系统配置nginx支持pathinfo和rewrite的写法
- Python合并字典的七种方式!
- php isapi mysql_windows server 2003以isapi的方式配置php+mysql环境的详细过程
- ----------------学习进度表---------------------------------
- 自定义View,圆形头像
- easy-ui的datagrid
- tcp有限状态机分析
- html怎么把新闻列表放在右边,div+css实现简洁、清晰的新闻列表样式(浮动使日期靠右)...
- 无人车系统(三):用python写一个简单的无人车仿真环境
- 怎么查询网络热点事件的舆论热度的办法技巧
- C语言正则表达式详解 regcomp() regexec() regfree()详解
- photoshop制作烫金效果logo详细教程
- ev4a ev6 ev8文件转换为mp4翻录教程
- Centos操作系统yum源的使用
- 嵌入式系统设计 (考试题+答案)
- SQL(MySQL)
- OpenTX与EdgeTX---kalrry
- Uber——面向领域的微服务架构
热门文章
- vue从零搭建一个前中后台权限管理模板
- (论文笔记)NeRV: Neural Representations for Videos
- IT项目启示录——来自泰坦尼克号的教训(第五篇)(转)
- 3GPP最新提案查询方法
- windows资源管理器转圈崩溃
- k8s重要概念及部署k8s集群(一)
- nuc8 黑苹果_NUC Hades Canyon (NUC8) 黑苹果(Hackintosh)安装指南
- 计算机网申兴趣爱好怎么写,网申简历中的特长爱好到底怎么写
- 使用jib-maven-plugin分层构建Docker镜像——避免直接使用FatJar
- Beamer 使用笔记