吃透 | Elasticsearch filter和query的不同

少啰嗦,直接看东西。——罗永浩

1、query和filter的本质区别?
以下几张图能更好的概括:

query关注点:此文档与此查询子句的匹配程度如何?

filter关注点:此文档和查询子句匹配吗?

2、Query检索细化关注点


1)是否包含?

确定文档是否应该成为结果的一部分.

2)相关度得分多少?

除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度的_score。

3)得分越高,相关度越高。

更相关的文件,在搜索排名更高。

典型应用场景:

1)全文检索——这种相关性的概念非常适合全文搜索,因为很少有完全“正确”的答案。

举例如下:

文档中存在字段hotel_name:“上海浦东香格里拉酒店”

IK实际分词结果如下:
上海浦东,上海,浦东,香格里拉,格里,里拉,酒店。

也就是说,搜索以上关键词都能搜到:hotel_name:“上海浦东香格里拉酒店”的酒店。这些都是“相关”的。

但是搜索:“香格里” 是搜索不到结果的。

2)包含单词“run”, 但也匹配”runs”, “running”, “jog”或者”sprint”。(都是奔跑的意思)

3、filter过滤细化关注点

1)是否包含?

确定是否包含在检索结果中,回答只有“是”或“否”。

2)不涉及评分。

在搜索中没有额外的相关度排名。

3)针对结构化数据。

适用于完全精确匹配,范围检索。

参见官网举例:
以下场景适用于filter过滤检索:

举例1:时间戳timestamp 是否在2015至2016年范围内?

举例2:状态字段status 是否设置为“published”?

4)更快。

只确定是否包括结果中,不需要考虑得分。

为什么会更快?——经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。

4、query和filter的性能不同
过滤查询(filter)是对集合包含/排除的简单检查,这使得它们计算速度非常快。 当至少有一个过滤查询是“稀疏”(仅有少量匹配的文档)时,可以利用各种优化,并且可以将缓存经常使用的filter过滤查询缓存在内存中以加快访问速度。

对比之下,query检索(评分查询)不仅要查找匹配的文档,还要计算每个文档的相关程度,这通常会使其比非评分文档更复杂。 另外,查询结果不可缓存。

由于倒排索引,只有几个文档匹配的简单评分查询(query检索)可能会比跨越数百万个文档的过滤器(filter过滤)表现得更好。 但是,一般来说,fiter过滤的性能将胜过评分查询(query检索)。

过滤(filter)的目标是减少必须由评分查询(query)检查的文档数量。

5、filter过滤怎么缓存呢?
Elasticsearch将创建一个文档匹配过滤器的位集bitset(如果文档匹配则为1,否则为0)。 随后用相同的过滤器执行查询将重用此信息。

每当添加或更新新文档时,位集bitset也会更新。

6、使用场景
全文检索以及任何使用相关性评分的场景使用query检索。

除此之外的其他使用filter过滤器过滤。

7、query和filter实战
ebay在Elasticsearch使用经验中总结到:

Use filter context instead of query context if possible.

即:如果可能,请使用filter过滤器上下文而不是query查询上下文。

查询query和过滤器filter已合并(在ES1.X版本是分开的,存在filtered检索类型)。

ES高版本(2.X/5.X/6.x以后),任何查询子句都可以在“查询上下文query”中用作查询,并在“过滤器上下文filter”中用作过滤器。

举例:

GET /_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8、小结
官网&源码才是王道。

多看、多思、多总结。弄清原理,高效开发才有了保障!

参考:

1、官网:

http://t.cn/R14moYO

http://t.cn/R14kLl6

2、实战:

http://t.cn/R1bZwy8

http://t.cn/RQhzDiP

3、Google工程师视频


加入知识星球,更短时间更快习得更多干货!
————————————————
版权声明:本文为CSDN博主「铭毅天下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laoyang360/article/details/80468757

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

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

相关文章

SpringCloud服务安全连接

转载自 SpringCloud服务安全连接Spring Cloud可以增加HTTP Basic认证来增加服务连接的安全性。 1、加入security启动器 在maven配置文件中加入Spring Boot的security启动器。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

HDU1232

Problem Description 某省调查城镇交通状况&#xff0c;得到现有城镇道路统计表&#xff0c;表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通&#xff08;但不一定有直接的道路相连&#xff0c;只要互相间接通过道路可达即可…

elasticsearch7常见查询(term、match、bool、filter)

一、精准查询termterm是代表完全匹配&#xff0c;即不进行分词器分析&#xff0c;文档中必须包含整个搜索的词汇 1、term单值 字段只有一个值时候&#xff0c;用term关键词查询 查询biz_id值为1909190023901225的记录 curl -XGET http://192.168.1.73:9200/xyerp/order/_sea…

SpringCloud Eureka自我保护机制

转载自 SpringCloud Eureka自我保护机制自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的&#xff0c;没有ZK中角色的概念&#xff0c; 即使N-1个节点挂掉也不会影响其他节点的正常运行。 默认情况下&#xff0c;如果Eureka Server在一定时间内&#xf…

HikariCP-史上最快速的连接池

转载自 HikariCP&#xff0d;史上最快速的连接池 背景 我们知道的连接池有C3P0,DBCP,它们都比较成熟稳定&#xff0c;但性能不是十分好。 所以有了BoneCP这个连接池&#xff0c;它是一个高速、免费、开源的JAVA连接池&#xff0c;它的性能几乎是C3P0、DBCP的25倍&#xff0c;十…

一起来学ES —— 浅谈Nested结构

Nested是什么? 直观的说&#xff0c;Nested实际上就是Object的数组。如下&#xff0c;这个user就是个nested结构 { "user" : [ {"first" : "John","last" : "Smith"},{"first" : "Alice","last…

并集查经典(转发)

首先在地图上给你若干个城镇&#xff0c;这些城镇都可以看作点&#xff0c;然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点&#xff0c;让你判断它们是否连通&#xff0c;或者问你整幅图一共有几个连通分支&#xff0c;也…

关于es查询dsl的filter与must,term与match的区别

【1】创建es7 索引 put localhost:9200/pdi_cust &#xff0c; 注意 PUB_CUST_LABEL 字段分词了。 es7 不支持type &#xff0c;所以 无需指定type。 { "mappings" :{ "properties":{"RCRD_ID":{"type":"keyword"…

高级Java必看的10本书

转载自 高级Java必看的10本书 1、深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践 本书共分为五大部分&#xff0c;围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析&#xff0c;深刻揭示了JVM的工作原理。 2、从Paxos到Zookee…

ES嵌套聚合

【1】 // dsl {"_source":["RCRD_ID", "STATE", "BUSI_CODE"], "query":{"bool":{"filter":[{"term":{"STATE":"PDOS"} }, {"nested":{"path":…

进阶Java架构师必看的15本书

转载自 进阶Java架构师必看的15本书 1、大型网站技术架构&#xff1a;核心原理与案例分析 本书通过梳理大型网站技术发展历程&#xff0c;剖析大型网站技术架构模式&#xff0c;深入讲述大型互联网架构设计的核心原理&#xff0c;并通过一组典型网站技术架构设计案例&#xff0…

HDU2612(BFS算法)

Problem Descrption Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. Yifenfei’s home is at the countryside, but Merceki’s home is in…

es 嵌套类型聚合

【1】分组后求均值聚合 //dsl {"_source":["RCRD_ID", "STATE", "BUSI_CODE"], "query":{"bool":{"filter":[{"term":{"STATE":"PDOS"} }]} }, "aggs"…

2017年,Java程序猿10本经典好书推荐

1、Java 8实战 本书全面介绍了Java 8 这个里程碑版本的新特性&#xff0c;包括Lambdas、流和函数式编程。有了函数式的编程特性&#xff0c;可以让代码更简洁&#xff0c;同时也能自动化地利用多核硬件。全书分四个部分&#xff1a;基础知识、函数式数据处理、高效Java 8 编程和…

es嵌套聚合dsl(求均值,求和)

【1】根据客户号分组后求均值和求和 // dsl {"_source":["RCRD_ID", "STATE", "BUSI_CODE"], "query":{"bool":{"filter":[{"term":{"STATE":"PDOS"} }]} }, &…

字符串拼接+和concat的区别

转载自 字符串拼接和concat的区别和concat都可以用来拼接字符串&#xff0c;但在使用上有什么区别呢&#xff0c;先来看看这个例子。 public static void main(String[] args) {// example1String str1 "s1";System.out.println(str1 100);//s1100System.out.prin…

thinking-in-java(21)并发2

think-in-java 并发前半部分&#xff08;并发1&#xff09;参见&#xff1a; https://blog.csdn.net/PacosonSWJTU/article/details/104855730 【21.4.3】中断 1、Thread类包含 interrupt方法&#xff0c;可以终止被阻塞的任务。这个方法将设置线程的中断状态。 如果一个线程…

HDU1176(DP)

Problem Description 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了&am…

Java趣味分享:try/finally

转载自 Java趣味分享&#xff1a;try/finally考虑以下四个测试方法&#xff0c;它们会输出什么&#xff1f;public class Test {public static void main(String[] args) {System.out.println(test1());System.out.println(test2());System.out.println(test3());System.out.pr…

(转)ThreadPoolExecutor最佳实践--如何选择队列

转自&#xff1a; https://blog.hufeifei.cn/2018/08/12/Java/ThreadPoolExecutor%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5--%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E9%98%9F%E5%88%97/ 前一篇文章《如何选择线程数》讲了如何决定线程池中线程个数&#xff0c;这篇文章讨论“如何…