DSL语句使用
Query DSL结构化查询介绍
Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句。采用API代替传统的拼接字符串来构造查询语句。目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。elasticsearch提供了一整套基于JSON的查询DSL语言来定义查询。
Query DSL当作是一系列的抽象的查询表达式树(AST)特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了。
索引操作
(1)查询所有索引
GET /_cat/indices?v
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-figxfnpu-1601349123392)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564603562118.png?lastModify=1601348506)]
(2)删除某个索引
DELETE /skuinfo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k17znNp-1601349123394)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564603680699.png?lastModify=1601348613)]
(3)新增索引
PUT /user
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUaiTyl8-1601349123396)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564603974567.png?lastModify=1601348681)]
(4)创建映射
PUT /user/userinfo/_mapping
{
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
},
"city":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
},
"age":{
"type": "long",
"store": false
},
"description":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKe9p7xs-1601349123397)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564604795013.png?lastModify=1601348725)]
(5)新增文档数据
PUT /user/userinfo/1
{
"name":"李四",
"age":22,
"city":"深圳",
"description":"李四来自湖北武汉!"
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnADI4B6-1601349123400)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564604217330.png?lastModify=1601348775)]
(6)修改数据
替换操作**
#更新数据,id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳工作!"
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsjfXXD3-1601349123401)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564606854935.png?lastModify=1601348837)]
使用GET命令查看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ts2b3qPZ-1601349123402)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564606945096.png?lastModify=1601348887)]
更新操作**
#使用POST更新某个域的数据
POST /user/userinfo/4/_update
{
"doc":{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳工作!"
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lf2nePJF-1601349123402)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564607209527.png?lastModify=1601348938)]
使用GET命令查看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PyVWja9x-1601349123403)(file://F:/%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE/2.%E7%95%85%E8%B4%AD%E5%95%86%E5%9F%8E/05-%E7%B4%A2%E5%BC%95%E6%90%9C%E7%B4%A2/%E8%AE%B2%E4%B9%89/images/1564607281098.png?lastModify=1601348958)]
(7)删除Document
#删除数据
DELETE user/userinfo/7
数据查询
查询所有数据
#查询所有
GET /user/_search
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U85oi21C-1601349123404)(E:\MarkDownPad\图片\1564605593912.png)]
(2)根据ID查询
#根据ID查询
GET /user/userinfo/2
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfG6H2Qj-1601349123404)(E:\MarkDownPad\图片\1564605676871.png)]
(3)Sort排序
#搜索排序
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvbiz88I-1601349123405)(E:\MarkDownPad\图片\1564605923564.png)]
(4)分页
#分页实现
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
},
"from": 0,
"size": 2
}
解释:
from:从下N的记录开始查询
size:每页显示条数
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FJ4UvOA-1601349123405)(E:\MarkDownPad\图片\1564606466826.png)]
过滤查询
(1)term过滤
term主要用于分词精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2.字符串值中有冒号或中文 3.系统自带属性如_version)
如下案例:
#过滤查询-term
GET _search
{
"query":{
"term":{
"city":"武汉"
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYq9DjNg-1601349123406)(E:\MarkDownPad\图片\1564607758341.png)]
(2)terms 过滤
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配 。
案例如下:
#过滤查询-terms 允许多个Term
GET _search
{
"query":{
"terms":{
"city":
[
"武汉",
"广州"
]
}
}
}
果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4H7nh5A-1601349123407)(E:\MarkDownPad\图片\1564608161056.png)]
(3) range 过滤
range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围
案例如下:
#过滤-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
"query":{
"range": {
"age": {
"gte": 30,
"lte": 57
}
}
}
}
上图效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTsb6wh3-1601349123407)(E:\MarkDownPad\图片\1564608377202.png)]
(4)exists过滤
exists 过滤可以用于查找拥有某个域的数据
案例如下:
#过滤搜索 exists:是指包含某个域的数据检索
GET _search
{
"query": {
"exists":{
"field":"address"
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpNJcMCv-1601349123408)(E:\MarkDownPad\图片\1564608891037.png)]
(5) bool 过滤
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
- must : 多个查询条件的完全匹配,相当于 and。
- must_not : 多个查询条件的相反匹配,相当于 not。
- should : 至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
案例如下:
#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{
"query": {
"bool": {
"must": [
{
"term": {
"city": {
"value": "深圳"
}
}
},
{
"range":{
"age":{
"gte":20,
"lte":99
}
}
}
]
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OyXztKoh-1601349123409)(E:\MarkDownPad\图片\1564609793695.png)]
(6) match_all 查询
可以查询到所有文档,是没有查询条件下的默认语句。
案例如下:
#查询所有 match_all
GET _search
{
"query": {
"match_all": {}
}
}
(7) match 查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符:
案例如下:
#字符串匹配
GET _search
{
"query": {
"match": {
"description": "武汉"
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRCXl8S8-1601349123410)(E:\MarkDownPad\图片\1564609964569.png)]
(8)prefix 查询
以什么字符开头的,可以更简单地用 prefix ,例如查询所有以张开始的用户描述
案例如下:
#前缀匹配 prefix
GET _search
{
"query": {
"prefix": {
"name": {
"value": "赵"
}
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Khoo6Ph-1601349123411)(E:\MarkDownPad\图片\1564610088455.png)]
(9)multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
案例如下:
#多个域匹配搜索
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BATchBs1-1601349123412)(E:\MarkDownPad\图片\1564610272233.png)]
efix": {
“name”: {
“value”: “赵”
}
}
}
}
效果如下:
[外链图片转存中...(img-1Khoo6Ph-1601349123411)]
(9)multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
案例如下:
```json
#多个域匹配搜索
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
效果如下:
[外链图片转存中…(img-BATchBs1-1601349123412)]