6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】

1.本文总结自:

Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文,还是在 过滤器上下文;

  • 过滤器上下文(filter context)不计算分数 ;

【1】相关性分数

默认情况下,elasticsearch根据相关性分数对匹配结果排序,该分数衡量了一个文档对查询条件的匹配程度;

  • 即使每一种查询根据不同方式计算出相关性分数,但计算分数与否取决于 查询子句是在 查询(query)还是在 过滤器(filter)的上下文中运行
    • 查询上下文要计算分数;
    • 过滤器上下文不计算分数;

【1.1】查询上下文(query context)

在查询上下文中,查询子句回答了这个问题,即这个文档与查询子句的匹配程度如何?;

  • 除了决定文档是否匹配外,查询子句还计算了 _score元字段的相关性分数
  • 只要把查询子句传递给查询参数(如搜索api中的查询参数),查询上下文就会生效;

【1.2】过滤器上下文(filter context)

1)在过滤器上下文中, 查询子句回答了这个问题,即这个文档是否匹配查询子句? 回答是简单的yes 或者 no;不会计算分数

2)过滤器上下文总是用于过滤结构化数据,如:

  • 是否这个时间戳在 2015和2016之间?
  • 是否 status字段设置为 published?

3)频繁使用的过滤器会被自动化缓存,以加速查询性能;

4)只要把查询子句传递给 filter 的参数,过滤器就会生效

  • 如 bool查询中的 filter 或 must_not 参数;
  • constant_score 查询中的 filter参数或filter聚合;

【2】查询与过滤器上下文例子

下面的例子是 查询api中 查询和过滤器上下文使用了查询子句。

这个查询会匹配哪些满足以下条件的文档:

  • address 包含单词 Holmes;
  • employer 字段包含单词  Pyrami;
  • gender 字段包含 精确单词 M(精确的意思是 等于);
  • age 字段包含大于28的文档;
post localhost:9200/bank/_search {"query":{"bool":{"must":[{"match":{"address":"Holmes"}},{"match":{"employer":"Pyrami"}}], "filter":[{"range":{"age":{"gte":28}}}, {"term":{"gender.keyword":"M"}}]}}
}// 查询结果 
{"took": 8,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 13.007463,"hits": [{"_index": "bank","_type": "account","_id": "1","_score": 13.007463,"_source": {"account_number": 1,"balance": 39225,"firstname": "Amber","lastname": "Duke","age": 32,"gender": "M","address": "880 Holmes Lane","employer": "Pyrami","email": "amberduke@pyrami.com","city": "Brogan","state": "IL"}}]}
} 

【查询dsl解说】

  • query参数:表示查询上下文;
  • bool 和 两个match子句用于查询上下文,这意味着它们对每个文档的匹配程度进行评分;
  • filter参数:表示过滤上下文;
  • term和 range子句用于过滤上下文。它们过滤掉不匹配的文档,但不影响匹配文档的分数;

【3】term术语查询

1)参考文档:  Term query | Elasticsearch Guide [7.2] | Elastic

2)上述例子中,term术语查询子句如下:

"term":{"gender.keyword":"M"}

term查询中为什么要查询gender.keyword 等于M的文档,而不是查询 gender 等于M的文档呢?

原因如下:因为 gender是 text类型字段,elasticsearch在保存文档时,会分析及分词,这样就会修改字段的原生值。如,标准分词器会把 text类型字段的值 做如下修改:

  • step1)移除大部分标点符号;
  • step2)把原生内容切分为单个单词,称为token(标记);
  • step3)把token标记转为小写;

所以经过上述转换后, id等于1的文档的gender原生值是M,文档在保存时,elasticsearch会将其修改为m

又 term精确匹配 M ,所以 1号文档显然不满足 term精确匹配的条件;

3)那如何使得 term精确匹配起作用呢(在不使用keyword的情况下)

显然 term精确匹配这样写即可。gender匹配m,而不是M

"term":{"gender":"m"}

【小结】term术语查询

  • 对于 text类型的字段,不建议使用 term做精确匹配查询,而建议使用 match 全文检索
  • 对于 keyword 类型的字段,建议使用 term做精确匹配查询;

【区别】term精确匹配与match全文检索的区别         

  • term精确匹配:查询前,不会对查询条件的值进行分词,直接进行查询;而text类型字段的值在文档被存储时就已经分词了,text字段的原生值被切分为多个独立的单词;
  • match全文检索:查询前,会对查询条件的值进行分词,然后再进行查询;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象,探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么?这是一个问题,一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略;2.通过版本号实现并发控制(类似于mysql中基于版本号的乐观锁);3.Es为支持并发控制,为每篇文章设置了版本号_version。初始值为1,每更新1次加1。…

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷,难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统,微软也不得不考虑如何加以应对,毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理?Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE,ΔBCF,ΔCDG,ΔDAH。则:EGFH,EG⊥FH。关于上述定理的几点说明:(1),条件是任意四边形,所…

java迭代实现二叉树先中后序遍历(非递归)

【README】 本文复习了通过java迭代实现 二叉树先序,中序,后序遍历; 本文引入了 栈,替换了递归,对二叉树进行遍历; 补充:使用递归遍历二叉树缺点: 众所周知,每次递归…

漫画:什么是分布式锁

转载自 漫画:什么是分布式锁分布式锁的实现有哪些?1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题,大概是说中国比国外好的有哪些方面,网友们例举了一大堆,其中有一条是说“在中国找工作比较容易”。 是的,特别对于我们IT从业者来说,找工作真的是小菜一碟;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展,对我们服务的支持又有了新的要求,比如在对接第三方服务时,需要自定义数据结构等。为此,经过 32 次的需求讨论会以及工程师们的紧张开发后,知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1) 本文总结于 数据结构与算法分析个人的学习心得体会,源代码均为原创; 0.2) 本文列出了数据结构中基本上所有的数据结构排序算法, 整理了相关的博文(源代码); 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则(FailedRequest Tracing Rules)是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则,并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中,因为日期的特殊性,大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些?如何运用?可以实现什么样的功能?今天小编就为大家整理出来并详细介绍一下常用的日期函…

软件开发的微信公众号分享

一、已阅 (1)程序员面试(mvpjob)(2)程序员小灰(chengxuyuanxiaohui)(3)Hollis(hollischuang)(4)Java技术栈&am…

算法递归简论

【0】README 0.1) 本文总结于 数据结构与算法分析,旨在了解设计 递归程序 的相关法则和技巧; 0.2) 我记忆尤新的一点是: 凡事可以用循环代替的递归函数,它就不是一个好的递归函数,对我帮助很大…

python三维矩阵可视化_科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)...

Mlab了解Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。过程为:.建立数据源.使用Filter(可选)对数据进行加工.添加可视化模块,我们可以通过修改可视化模块的属…