由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询. DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现.
2. DSL组成: DSL查询+DSL过滤
dsl过滤简单理解为就是精确查询,而dsl查询是模糊查询(like).由于查询需要做相关度排序,并且过滤可以缓存,所以过滤的效率高于查询.所以只有必须要用查询的时候才用它(模糊查询),否则都用过滤.
3. DSL客户端工具
可以利用Kibana的Dev Tools作为客户端工具,执行相关的DSL命令.
GET /_search
2. 创建Document
PUT /products/product/1
{
"name" : "mac pro",
"desc" : "苹果本,很贵",
"price" : 30,
"tag": [ "很贵", "好用" ]
}
PUT /products/product/2
{
"name" : "小米",
"desc" : "手机中的战斗机",
"price" : 25,
"tag": [ "发烧机" ]
}
PUT /products/product/3
{
"name" : "西瓜",
"desc" : "夏天的解暑神器",
"price" : 2,
"tag": [ "麒麟瓜" ]
}
3. 检索文档查询
GET /products/product/1
4. 替换文档(全量替换)
PUT /products/product/1
{
"name" : "神舟笔记本",
"desc" : "还不错哦",
"price" : 300,
"tag": [ "国产", "不错" ]
}
5. 更新文档(_update)
POST /products/product/1/_update
{
"doc":
{
"price":70
}
}
6. 删除文档
DELETE /products/product/1
注意:
在删除一个Document之后,它不是立即物理删除的,它的版本等信息还保留着.
三. DSL查询 1. query string search比如要搜索全部商品:GET /products/product/_search
(参数直接拼接在请求url上,不带json参数).
query string search的由来,因为search参数都是以http请求的query string所附带的,搜索商品名称中包含mac pro的商品,并且按照售价降序排序: GET /products/product/_searchq=name:mac pro&sort=price:desc
适用于临时在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息.但是如果查询请求很复杂,是很难去构建的,所以在生产环境中,几乎很少使用query string search.
2. query DSLDSL: Domain Specified Language, 特定领域的语言.http request body: 请求体,可以用json的格式来构建查询语法,比较方便.也可以构建各种复杂的语法,比query string search功能强大的多.
2.1 查询所有的商品GET products/product/_search
{
"query":
{
"match_all": {}
}
}
2.2 查询名称包含 "小米" 的产品,同时按照价格进行降序排序
GET products/product/_search
{
"query": {
"match": {
"name": "小米"
}
},
"sort": [
{
"price":"desc"
}
]
}
2.3 分页查询
总共3条商品,假设每页就显示1条商品,现在显示第1页,所以就查出来第1个商品.
GET products/product/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 1
}
2.4 查询指定项
GET products/product/_search
{
"query": {
"match_all": {}
},
"_source":["name","price"]
}
四. DSL过滤
1. DSL过滤简介
DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同: DSL过滤查询一般是指我们的条件“有”或者“没有”,而DSL查询则一般是指我们的条件“有多像”. DSL过滤和DSL查询在性能上的区别:
- 1️⃣.过滤结果可以缓存并应用到后续请求;
- 2️⃣.查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存;
- 3️⃣.过滤语句可有效地配合查询语句完成文档过滤.
原则上,使用DSL查询做全文搜索或其他需要进行相关性评分的场景,其它全用DSL过滤.
2. 过滤查询搜索商品名称包含 "西瓜",且售价大于2元的商品.
# dsl过滤
GET products/product/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": {
"range": {
"price": {
"gte": 10,
"lte": 100
}
}
}
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
],
"from": 0,
"size": 2,
"_source": ["name","price"]
}
3. 单词搜索与过滤(Term和Terms)
3.1 term过滤
GET products/product/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"tags":"甜"
}
}
}
}
}
3.2 Terms搜索与过滤
GET products/product/_search
{
"query": {
"terms": {
"tags": ["甜","新疆"]
}
}
}
4. 组合条件搜索与过滤(Bool)
组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not.
例如: 查询爱好有美女,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人.
{
"query": {
"bool": {
"must": [{"term": {"hobby": "美女"}}],
"should": [
{"term": {"hobby": "游戏"}},
{"term": {"hobby": "运动"}}
],
"must_not": [
{"range" :{"birth_date":{"lt": "1990-06-30"}}}
],
"filter": [...],
"minimum_should_match": 1
}
}
}
提示:
如果 bool 查询下没有must子句,那至少应该有一个should子句,但是 如果有 must子句,那么没有 should子句也可以进行查询.
5. 范围查询与过滤(range)range过滤允许我们按照指定范围查找一批数据:
gt:> gte:>= lt:< lte:
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?