ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法
1、数据准备
首先创建book索引
PUT /book/
{"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"description": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"studymodel": {"type": "keyword"},"price": {"type": "double"},"timestamp": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"},"pic": {"type": "text","index": false}}}
}
插入数据
PUT /book/_doc/1
{"name": "Bootstrap开发","description": "Bootstrap是一个非常流行的开发框架。此开发框架可以帮助不擅长css页面开发的程序人员轻松的实现一个css,不受浏览器限制的精美界面css效果。","studymodel": "201002","price": 38.6,"timestamp": "2019-08-25 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["bootstrap","dev"]
}PUT /book/_doc/2
{"name": "java编程思想","description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。","studymodel": "201001","price": 68.6,"timestamp": "2019-08-25 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["java","dev"]
}PUT /book/_doc/3
{"name": "spring开发基础","description": "spring 在java领域非常流行,java程序员都在用。","studymodel": "201001","price": 88.6,"timestamp": "2019-08-24 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["spring","java"]
}
2、Filter与Query示例
需求:用户查询description中有"java程序员",并且价格大于80小于90的数据。
2.1 Query
首先采用Query来进行查询,首先查询description中有"java程序员"。
GET /book/_search
{"query": {"bool": {"must": [{"match": {"description": "java程序员"}}]}}
}
查询结果如下:
可以看到,查询出来两条数据,score分别是1.9、0.5。
然后查询description中有"java程序员",并且价格大于80小于90的数据
GET /book/_search
{"query": {"bool": {"must": [{"match": {"description": "java程序员"}},{"range": {"price": {"gte": 80,"lte": 90}}}]}}
}
再次查看结果:
这次查询出来一条数据,score变为2.9。这一条数据在上一次的查询结果中的score为1.9。然后接着往下看使用Filter。
2.2 filter
还是相同的需求,首先查询description中有"java程序员"。
GET /book/_search
{"query": {"bool": {"must": [{"match": {"description": "java程序员"}}]}}
}
查询结果如下:
通过查询结果可以看到,查询的两条数据的score是1.9、0.5。
然后使用filter查询description中有"java程序员",并且价格大于80小于90的数据
GET /book/_search
{"query": {"bool": {"must": [{"match": {"description": "java程序员"}}],"filter": {"range": {"price": {"gte": 80,"lte": 90}}}}}
}
查询结果如下:
可以看到,查询出来的数据与使用query查询结果一样,但是score依旧为1.9。
说明在使用query查询的过程中,影响到了相关度(score)的排序,在使用filter进行查询,并不会影响相关度(score)的计算。
2.3 filter与query对比
filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。
query,会去计算每个document相对于搜索条件的相关度,并按照相关度进行排序。
应用场景:
一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query。如果你只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter。
2.4 filter与query性能
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据。比如在范围查询,keyword字段查询中推荐使用filter来进行查询。
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果。
在同等查询结果下,filter的性能一般是要优于query的。
3、explain分析语法
在实际的应用过程中,需要查询的逻辑一般比较复杂,那当语句冗长的时候,这时候显然不太可能通过直接执行语句来调试语法正确与否,这个时候就可以通过explain来验证语句的正确性。
验证错误语句:
GET /book/_validate/query?explain
{"query": {"mach": {"description": "java程序员"}}
}
返回结果如下,错误信息为没有名叫mach的query。
{"valid" : false,"error" : "org.elasticsearch.common.ParsingException: no [query] registered for [mach]"
}
再来看语句正确的情况下
GET /book/_validate/query?explain
{"query": {"match": {"description": "java程序员"}}
}
返回,返回结果还包含对语句的解释:从description查询java关键词,从description查询程序员关键词。
{"_shards" : {"total" : 1,"successful" : 1,"failed" : 0},"valid" : true,"explanations" : [{"index" : "book","valid" : true,"explanation" : "description:java description:程序员"}]
}
应用场景:
一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这个时候可以先用validate api去验证一下,搜索是否合法。合法以后,explain就像mysql的执行计划,可以看到搜索的目标等信息。
ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法相关推荐
- OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...
- VUE学习(二十一)、Vuex(getters、mapState与mapGetters、mapMutations与mapActions、多组件共享数据、模块化编码)
VUE学习(二十一).Vuex(getters.mapState与mapGetters.mapMutations与mapActions.多组件共享数据.模块化编码) 一.Vuex普通实现求和案例 演示 ...
- ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例
一.两个核心概念:bucket和metric 1.1 bucket 有如下数据 city name 北京 张三 北京 李四 天津 王五 天津 赵六 天津 王麻子 划分出来两个bucket,一个是北 ...
- Java多线程学习二十一:ConcurrentHashMap 在 Java7 和 8 有何不同
在 Java 8 中,对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级,对比之前 Java 7 版本在诸多方面都进行了调整和变化.不过,在 Java 7 中的 Segment ...
- Go语言学习 二十一 内嵌
本文最初发表在我的个人博客,查看原文,获得更好的阅读体验 在像Java这种语言中,有子类(或者继承)的概念,通过继承复用已有的功能或属性,与继承不同,Go中使用组合的方式来完成已有实现的复用,这种做法 ...
- android学习(二十一) 下载数据减少电池损耗
高效的网络访问(优化下载) 使用无线网络下载数据是你的应用消耗电池潜在的重要原因之一.为了降低和网络有关的activity连接导致的电池消耗.你理解你的连接模型怎样影响无线硬件这是很关键的. 下面将介 ...
- Java基础学习(二十一)之接口
1. 接口 1.1 接口概述 五孔插线面板,不同品牌都能使用,因为它们遵循同样的规范来生产的.所以说接口其实就是一种公共的规范,只要符合规范,大家都可以使用. 笔记本,USB口,鼠标,键盘,U盘 接口 ...
- 推荐系统遇上深度学习(二十一)--贝叶斯个性化排序(BPR)算法原理及实战
笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...
- k8s学习(二十一) 亲和性调度
亲和性调度可以分成软策略和硬策略两种方式: 软策略就是如果你没有满足调度要求的节点的话,pod 就会忽略这条规则,继续完成调度过程,说白了就是满足条件最好了,没有的话也无所谓了的策略 硬策略就比较强硬 ...
最新文章
- 政府大数据应用的反思;大数据分析应用常见的困难
- java 毫秒转为日期_java将毫秒转化为日期
- 自动化部署必备技能—定制化RPM包[转载]
- 中国移动研究院2020春招技术综合JAVA在线编程题第二题
- CentOS 7 firewall防火墙命令
- 从零点五开始用Unity做半个2D战棋小游戏(完)
- python图像分类_用于实现用python和django编写的图像分类的Keras UI
- python可以做表格文档吗_生活中的python-利用python-docx自动生成表格简化工作流程...
- HDU.1001 Sum Problem
- 图片居中裁剪_魔镜,魔镜,谁最美丽!利用PS图层混合模式打造图片幻觉效果
- 普通摄像头游戏——飞翔
- 免疫算法(matlab)
- Linux周立功CAN驱动安装指导
- 遥感原理与应用网络课程学习
- android RS485串口接线正反的问题
- 自动执行bash被拒绝 提示/bin/sh: /test.sh: Permission denied
- 数组输出c语言getchar,C语言入门 — getchar
- 不值一提的计算机基础教程-0-前言
- Android 获取局域网内网IP地址
- Android shape画一个圆角虚线框