ElasticSearch中的DSL查询与DSL过滤

DSL查询

定义

对于简单查询,使用查询字符串比较好,但是对于复杂查询,由于条件多,逻辑嵌套复杂,查询字符串不易组织与表达,且容易出错,因此推荐复杂查询通过DSL使用JSON内容格式的请求体代替。

DSL查询是由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。DSL有两部分组成:DSL查询(like)和DSL过滤(非like)。

语法

GET /cm/user/_search
{
	"query": {
   		"match_all": {}
	},
	"from": 20, 
	"size": 10,
	"_source": ["username", "age", "id"],
	"sort": [{"join_date": "desc"},{"age": "asc"}]
}

 match_all 表示 查询所有数据,查询返回fullName,age和email几个列,按照加入日期和年龄进行排序

定向查询

GET /cm/user/_search
{
	"query" : {
   		"match" : {
   			"username" : "老李"
		}
	}
}

 查询username中包含“老李”的内容,match指的是“标准查询”,该查询方式会对查询的内容进行分词。DSL查询可以支持的查询方式很多,如term词元查询 ,range范围查询等等。

DSL过滤

定义

DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:DSL过滤查询文档的方式更像是对于我的条件"有"或者"没有"(等于 ;不等于),而DSL查询语句则像是"有多像"(模糊查询)。

查询与过滤的区别

DSL过滤和DSL查询在性能上的区别:

  • 过滤结果可以缓存并应用到后续请求。-> 精确过滤后的结果拿去模糊查询性能高

  • 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。

  • 过滤语句可有效地配合查询语句完成文档过滤。

总结:需要模糊查询(分词查询)的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) ,关键字查询使用DSL查询,其他的都 是用DSL过滤。

GET /cm/user/_search
{
	"query": { 
		"bool": { 		//booleanQuery 组合
			"must": [{	//与(must) 或(should) 非(must not) 
				"match": { //match : 匹配,吧查询的内容分词后去查询
					"username": "rose"
				},
			}],
            "should": [{	//与(must) 或(should) 非(must not) 
				"match": { //match : 匹配,吧查询的内容分词后去查询
					"username": "jack"
				},
			}],
			"filter": {
				"term": {
					"name": "jack rose"  
				}
			}
		}
	},
	"from": 20,
	"size": 10,
	"_source": ["name", "age", "username"],
	"sort": [{
		"join_date": "desc"
	}, {
		"age": "asc"
	}]
}

解释:

  • query : 查询,所有的查询条件在query里面

  • bool : 组合搜索bool可以组合多个查询条件为一个查询对象,这里包含了 DSL查询和DSL过滤的条件

  • must : 必须匹配 :与(must) 或(should) 非(must_not)

  • match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配

  • filter: 过滤条件

  • term:词元查询,不会对查询条件分词

  • from,size :分页

  • _source :查询结果中需要哪些列

  • sort:排序

总计:ES在当前的市场中应用面十分广泛,此次给大家简单介绍一下其中的DSL查询与过滤,希望能够给大家带来帮助。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值