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关键字分析语法相关推荐

  1. OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

    OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...

  2. VUE学习(二十一)、Vuex(getters、mapState与mapGetters、mapMutations与mapActions、多组件共享数据、模块化编码)

    VUE学习(二十一).Vuex(getters.mapState与mapGetters.mapMutations与mapActions.多组件共享数据.模块化编码) 一.Vuex普通实现求和案例 演示 ...

  3. ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例

    一.两个核心概念:bucket和metric 1.1 bucket 有如下数据 city name  北京 张三  北京 李四 天津 王五 天津 赵六 天津 王麻子 划分出来两个bucket,一个是北 ...

  4. Java多线程学习二十一:ConcurrentHashMap 在 Java7 和 8 有何不同

    在 Java 8 中,对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级,对比之前 Java 7 版本在诸多方面都进行了调整和变化.不过,在 Java 7 中的 Segment ...

  5. Go语言学习 二十一 内嵌

    本文最初发表在我的个人博客,查看原文,获得更好的阅读体验 在像Java这种语言中,有子类(或者继承)的概念,通过继承复用已有的功能或属性,与继承不同,Go中使用组合的方式来完成已有实现的复用,这种做法 ...

  6. android学习(二十一) 下载数据减少电池损耗

    高效的网络访问(优化下载) 使用无线网络下载数据是你的应用消耗电池潜在的重要原因之一.为了降低和网络有关的activity连接导致的电池消耗.你理解你的连接模型怎样影响无线硬件这是很关键的. 下面将介 ...

  7. Java基础学习(二十一)之接口

    1. 接口 1.1 接口概述 五孔插线面板,不同品牌都能使用,因为它们遵循同样的规范来生产的.所以说接口其实就是一种公共的规范,只要符合规范,大家都可以使用. 笔记本,USB口,鼠标,键盘,U盘 接口 ...

  8. 推荐系统遇上深度学习(二十一)--贝叶斯个性化排序(BPR)算法原理及实战

    笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...

  9. k8s学习(二十一) 亲和性调度

    亲和性调度可以分成软策略和硬策略两种方式: 软策略就是如果你没有满足调度要求的节点的话,pod 就会忽略这条规则,继续完成调度过程,说白了就是满足条件最好了,没有的话也无所谓了的策略 硬策略就比较强硬 ...

最新文章

  1. 政府大数据应用的反思;大数据分析应用常见的困难
  2. java 毫秒转为日期_java将毫秒转化为日期
  3. 自动化部署必备技能—定制化RPM包[转载]
  4. 中国移动研究院2020春招技术综合JAVA在线编程题第二题
  5. CentOS 7 firewall防火墙命令
  6. 从零点五开始用Unity做半个2D战棋小游戏(完)
  7. python图像分类_用于实现用python和django编写的图像分类的Keras UI
  8. python可以做表格文档吗_生活中的python-利用python-docx自动生成表格简化工作流程...
  9. HDU.1001 Sum Problem
  10. 图片居中裁剪_魔镜,魔镜,谁最美丽!利用PS图层混合模式打造图片幻觉效果
  11. 普通摄像头游戏——飞翔
  12. 免疫算法(matlab)
  13. Linux周立功CAN驱动安装指导
  14. 遥感原理与应用网络课程学习
  15. android RS485串口接线正反的问题
  16. 自动执行bash被拒绝 提示/bin/sh: /test.sh: Permission denied
  17. 数组输出c语言getchar,C语言入门 — getchar
  18. 不值一提的计算机基础教程-0-前言
  19. Android 获取局域网内网IP地址
  20. Android shape画一个圆角虚线框

热门文章

  1. 嵌入式C语言--面试题
  2. 动态规划法求解整数拆分问题
  3. 手机同声翻译软件哪个好?试试这款不错的同声互译软件
  4. 蒟蒻信安笔记1:网络扫描与网络侦查
  5. 电脑冷启动首次开机黑屏 重启恢复正常的解决办法
  6. java数组赋值后可以更改吗_我们可以为Java中的最终数组赋值吗?
  7. gitlab 安装与502报错
  8. 个人入职工作必备软件安装
  9. 计算机启动按钮不灵如何维修,电脑开机按钮的修理妙招与技巧
  10. 【转载】张正友标定法翻译