Elasticsearch 入门教程 – bool 过滤器

【Elasticsearch】 10-DSL语法详解-复合查询bool(must、should、must_not、filter) bool查询是Elasticsearch中的布尔查询,它允许组合多个查询条件以过滤和排序文档。must:所有的查询子句都必须匹配,类似于"AND"操作。should:至少一个查询子句必须匹配,类似于"OR"操作。must_not:查询子句不应该匹配,类似于"NOT"操作。filter:与must相似,但不会影响查询的相关性得分。bool查询内部可以包含多个全文检索和精确查询语法,子查询可以任意顺序出现,可以嵌套多个查询 阅读详情

在了解之前,先来理解filter与query不同:

Query与Filter

    查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:

查询上下文:

     在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

      如何验证匹配很好理解,如何计算相关度呢?之前说过,ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的      分值计算还是很复杂的,因此也需要一定的时间。

      查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。

过滤器上下文:

     在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”

     答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

     过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter 

      另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

总结

   1 查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件

  2 过滤器上下文中,查询的结果可以被缓存。

前提准备:

(1)插入一些测试帖子数据

POST /forum/article/_bulk

{ "index": { "_id": 1 }}

{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 2 }}

{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }

{ "index": { "_id": 3 }}

{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 4 }}

{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

布尔过滤器

    前面的两个例子都是单个过滤器(filter)的使用方式。 在实际应用中,我们很有可能会过滤多个值或字段。比方说,怎样用 Elasticsearch 来表达下面的 SQL ?

SELECT product
FROM   products
WHERE  (price = 20 OR productID = "XHDK-A-1293-#fJ3")
  AND  (price != 30)

    这种情况下,我们需要 bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。

一个 bool 过滤器由三部分组成:

{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}
  • must

    所有的语句都 必须(must) 匹配,与 AND 等价。

  • must_not

    所有的语句都 不能(must not) 匹配,与 NOT 等价。

  • should

    至少有一个语句要匹配,与 OR 等价。

  就这么简单! 当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。

一个 bool 过滤器的每个部分都是可选的(例如,我们可以只有一个 must 语句),而且每个部分内部可以只有一个或一组过滤器。

用 Elasticsearch 来表示本部分开始处的 SQL 例子,将两个 term 过滤器置入 bool 过滤器的 should 语句内,再增加一个语句处理 NOT 非的条件:

GET /my_store/products/_search
{
   "query" : {
      "filtered" : { 
         "filter" : {
            "bool" : {
              "should" : [
                 { "term" : {"price" : 20}}, 
                 { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
              ],
              "must_not" : {
                 "term" : {"price" : 30} 
              }
           }
         }
      }
   }
}

注意,我们仍然需要一个 filtered 查询将所有的东西包起来。

 

在 should 语句块里面的两个 term 过滤器与 bool 过滤器是父子关系,两个 term 条件需要匹配其一。

如果一个产品的价格是 30 ,那么它会自动被排除,因为它处于 must_not 语句里面。

我们搜索的结果返回了 2 个命中结果,两个文档分别匹配了 bool 过滤器其中的一个条件:

"hits" : [
    {
        "_id" :     "1",
        "_score" :  1.0,
        "_source" : {
          "price" :     10,
          "productID" : "XHDK-A-1293-#fJ3" 
        }
    },
    {
        "_id" :     "2",
        "_score" :  1.0,
        "_source" : {
          "price" :     20, 
          "productID" : "KDKE-B-9947-#kL5"
        }
    }
]

与 term 过滤器中 productID = "XHDK-A-1293-#fJ3" 条件匹配

与 term 过滤器中 price = 20 条件匹配

Java 客户端代码:

SearchRequestBuilder srq =  client.prepareSearch("forum").setTypes("article");  

        srq.setSearchType(SearchType.DFS_QUERY_AND_FETCH);  

        QueryBuilder queryBuilder=QueryBuilders.constantScoreQuery(

                 QueryBuilders.boolQuery().should(QueryBuilders.termQuery("postDate", "2017-01-01"))

                         .should(QueryBuilders.termQuery("articleID", "XHDK-A-1293-#fJ3"))

                        .mustNot(QueryBuilders.termQuery("postDate", "2017-01-02")));

         

        srq.setQuery(queryBuilder);

        SearchResponse response=srq.execute().get();

        System.out.println(srq.toString());

        for (SearchHit searchHit : response.getHits()) {

            System.out.println(searchHit.getScore());

            Map source = searchHit.getSource();

            System.out.println(source.toString());

        }

嵌套布尔过滤器

尽管 bool 是一个复合的过滤器,可以接受多个子过滤器,需要注意的是 bool 过滤器本身仍然还只是一个过滤器。 这意味着我们可以将一个 bool 过滤器置于其他 bool 过滤器内部,这为我们提供了对任意复杂布尔逻辑进行处理的能力。

对于以下这个 SQL 语句:

SELECT document
FROM   products
WHERE  productID      = "KDKE-B-9947-#kL5"
  OR (     productID = "JODL-X-1937-#pV7"
       AND price     = 30 )

我们将其转换成一组嵌套的 bool 过滤器:

GET /my_store/products/_search
{
   "query" : {
      "filtered" : {
         "filter" : {
            "bool" : {
              "should" : [
                { "term" : {"productID" : "KDKE-B-9947-#kL5"}}, 
                { "bool" : { 
                  "must" : [
                    { "term" : {"productID" : "JODL-X-1937-#pV7"}}, 
                    { "term" : {"price" : 30}} 
                  ]
                }}
              ]
           }
         }
      }
   }
}

 

因为 term 和 bool 过滤器是兄弟关系,他们都处于外层的布尔逻辑 should 的内部,返回的命中文档至少须匹配其中一个过滤器的条件。

 

这两个 term 语句作为兄弟关系,同时处于 must 语句之中,所以返回的命中文档要必须都能同时匹配这两个条件。

得到的结果有两个文档,它们各匹配 should 语句中的一个条件:

"hits" : [
    {
        "_id" :     "2",
        "_score" :  1.0,
        "_source" : {
          "price" :     20,
          "productID" : "KDKE-B-9947-#kL5" 
        }
    },
    {
        "_id" :     "3",
        "_score" :  1.0,
        "_source" : {
          "price" :      30, 
          "productID" : "JODL-X-1937-#pV7" 
        }
    }
]

这个 productID 与外层的 bool 过滤器 should 里的唯一一个 term 匹配。

 

这两个字段与嵌套的 bool 过滤器 must 里的两个 term 匹配。


Java 客户端代码:

SearchRequestBuilder srq =  client.prepareSearch("forum").setTypes("article");  

        srq.setSearchType(SearchType.DFS_QUERY_AND_FETCH);  

        srq.setQuery( QueryBuilders.boolQuery().should(

                 QueryBuilders.termQuery("productID", "XHDK-A-1293-#fJ3"))

                 .should(

                QueryBuilders.boolQuery().must(QueryBuilders.termQuery("articleID", "JODL-X-1937-#pV7"))

                 .must(QueryBuilders.termQuery("postDate", "2017-01-01"))

                         ));

        SearchResponse response=srq.execute().get();

        System.out.println(srq.toString());

        for (SearchHit searchHit : response.getHits()) {

            System.out.println(searchHit.getScore());

            Map source = searchHit.getSource();

            System.out.println(source.toString());

        }

这只是个简单的例子,但足以展示布尔过滤器可以用来作为构造复杂逻辑条件的基本构建模块。

掌握 ElasticSearch 组合查询:Bool Query 详解与实践 为了应对这些复杂的查询需求,Elasticsearch 提供了 **`bool` 查询**。`bool` 查询就像一个强大的工具箱,它允许你将多个查询条件组合在一起,形成更复杂的查询逻辑。你可以将 `bool` 查询看作是乐高积木,通过组合不同的积木块(查询子句),你可以搭建出各种各样的结构(查询逻辑)。 阅读详情

相关推荐

Kibana日志查询实战:从KQL语法到性能优化,精准定位数据

在日志分析与运维监控领域,Elasticsearch作为核心的搜索与分析引擎,其查询能力直接决定了数据排查的效率。理解其查询原理,特别是如何将用户意图转化为高效的查询语句,是提升日志分析价值的关键。这涉及到对查询语言(如KQL和Lucene语法)的掌握、对字段映射与分词机制的理解,以及对查询性能优化原则的运用。掌握这些技术,能够帮助工程师在海量日志中快速定位问题根因,例如精准筛选特定格式的字段值或分析慢查询模式,从而将日志数据从被动记录转变为主动监控与故障排查的利器。本文聚焦于Kibana这一主流可视化工具

weixin_34056162的博客 375

Elasticsearch查询 - Bool查询

Bool查询是Elasticsearch中最为强大的查询方式之一,它能够通过将多个子查询进行逻辑组合的方式,实现复杂的查询需求。在Bool查询中,可以使用must、must_not、should和filter这四种不同类型的子查询。其中,must代表必须满足的查询条件,must_not代表不能满足的查询条件,should代表可选满足的查询条件,而filter则是无论是否满足都会参与计算的查询条件。通过这些子查询的逻辑组合,可以实现复杂的查询需求。

weixin_43796428的博客 6065

从课程项目到技术作品集:以校园二手平台为例的工程实践指南

在软件工程领域,技术选型与架构设计是构建可扩展、高性能应用的核心。理解缓存、搜索、容器化等基础组件的原理,是提升系统性能与开发效率的关键。缓存技术通过将热点数据存储在内存中,有效降低数据库负载,其价值在于应对高并发场景,提升响应速度。搜索技术则从简单的数据库模糊查询演进到基于倒排索引的全文检索引擎,解决了海量数据下的精准检索需求。这些技术的应用场景广泛,从电商平台到内容社区无处不在。本文以校园二手书交易平台(TYC)为例,具体展示了如何将Redis缓存与Elasticsearch搜索等通用技术深度集成,通过

weixin_34234829的博客 408

Elasticsearch bool查询命令详解

bool查询介绍 如果我们需要针对多个字段进行多维度的查询,那么布尔查询是你的最佳选择,它可以通过组合多个查询语句得到最终得结果. bool查询的使用 must 查询必须匹配某些条件才可以返回 must_not查询必须不匹配某些条件 should当查询满足此条件时,会增加其_score值 filter 必须匹配,但是结果不会计算分值。 ...

枸杞泡茶的博客 2559

Qt框架入门:从信号槽到跨平台部署的C++ GUI开发全指南

C++ GUI开发是构建桌面应用的核心技术之一,其关键在于选择高效、跨平台的框架。Qt作为成熟的C++应用程序框架,通过独特的信号槽机制实现对象间通信,有效降低了模块耦合度,提升了代码可维护性。其元对象系统(MOC)在标准C++基础上提供了反射能力,支撑了信号槽、动态属性等高级特性。在工程实践中,Qt的模块化设计允许开发者按需引入功能,而qmake或CMake构建系统则管理着包含MOC预处理在内的完整编译流程。对于常见的“qt安装”与“环境配置”问题,官方Qt Creator提供了开箱即用的解决方案,而VS

weixin_30336061的博客 396

【Elasticsearch】elasticsearch bool 布尔 查询

1.概述 bool 查询 must:与关系,相当于关系型数据库中的and。 should:或关系,相当于关系型数据库中的or。 must_not:非关系,相当于关系型数据库中的not。 filter:过滤条件。 range:条件筛选范围。 gt:大于,相当于关系型数据库中的>。 gte:大于等于,相当于关系型数据库中的>=。 lt:小于,相当于关系型数据库中的<。 lte:小于等于,相当于关系型数据库中的<= must和filter经常连用, should和filter不常在一.

九师兄 722

分布式搜索引擎-ES-进阶

分布式搜索引擎-ES 一、文档乐观锁控制 1.版本7.2以前 版本7.2以前ES根据version来做乐观锁控制 (1) 更新文档的部分数据 格式:post请求 – http://192.168.43.8:9200/索引库名称/_doc/文档id?version=版本号 请求体中数据: { "doc": { "name": "study-2", "desc": "study is very good, 学习非常优秀!!" } } (2) 更新文档的所有数据 格式:post请求 – http:/

qq_42282792的博客 393

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作03

SQL中的WITH RECURSIVE实现树形查询(组织架构、分类树);无人机禁飞区(多边形)与飞行器(圆形)的冲突检测;:Cx​=6A1​∑i=0n−1​(xi​+xi+1​)(xi​yi+1​−xi+1​yi​),C_y类似;CRF(条件随机场)中的配分函数计算;电力网络中的最低成本路径(允许负成本);3D游戏中的视锥体裁剪(剔除不在视野内的物体);编译器的关键字表(C语言的goto/label);无线网络中的信道分配(避免干扰);AutoCAD中的布尔运算(合并/剪切/交集);图像处理中的区域叠加。

weixin_49199313的博客 315

Elasticsearch入门四:Elasticsearch-搜索、过滤、聚合

title: Elasticsearch入门四:Elasticsearch-搜索、过滤、聚合(译) date: 2018-11-01 17:00:00 tags: Elasticsearch 原文地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/_exploring_your_data.html 一.搜索 AP...

sunjian1122的博客 1296

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作02

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景301集合运算关系代数关系集合Feature Selection (Chi-Square)集合运算卡方检验目标函数:χ2=∑E(O−E)2​ 衡量分类特征与目标的相关性;资源:O(n·d);条件:离散特征,离散目标;组合约束:值越大相关性越强。 数据结构:列联表。 代码实现(C++): 特征列,目标列文本分类中的特征选择。302集合运算关系代数关系集合Feature Selection (ANOVA F

weixin_49199313的博客 309

【信息科学与工程学】【数据中心】第三十三篇 云数据中心综合解决方案探讨04

的计算/存储/网络/安全/互相访问设计的计算/存储/网络/安全设计的计算/存储/网络/安全设计编号类型问题(计算机系统架构/网络架构/信息架构/业务架构/组织架构/管理架构)问题的数学分析(方程/算法+求解器)参数列表时序与稳态/非稳态分析关联知识(工具/工艺)互联网接入区/DMZ区 等(含详细资源规划、互相访问限制、安全设计、网络配置、软件策略、算法策略与算法详细设计;;设计的完整代码(示例)多/双/单Region+AZ(含详细资源规划与配置设计)A276​ (基于。

weixin_49199313的博客 3556

Elasticsearch 2.3.3 JAVA api说明文档

原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html翻译作者:@青山常在人不老 加入翻译:cdcnsuper@blog-china.cn 版权所有:@码上中国博客(https://blog-china.cn) 1前言 本节介绍elasticsearch...

dht91597的博客 558

FDTD材料nk值拟合优化指南:利用材料资源管理器提升光学模型精度

本文详细介绍了如何利用FDTD仿真软件中的材料资源管理器,对材料nk值进行精确拟合与优化,从而提升光学模型的仿真精度。文章通过实战案例,解析了拟合参数调整、报告解读以及针对varFDTD求解器的特殊注意事项,帮助用户从根本上解决仿真结果不准的常见问题。

weixin_29196891的博客 352

Elasticsearch 7.10 之 Start searching

将一些数据摄入 Elasticsearch 索引后,您可以通过将请求发送到 _search 端点来进行搜索。要访问全套搜索功能,请使用 Elasticsearch Query DSL 在请求正文中指定搜索条件。您可以在请求 URI 中指定要搜索的索引的名称。 例如,以下请求将检索 bank 索引中按帐号排序的所有文档: GET /bank/_search { "query": { "match_all": {} }, "sort": [ { "account_number": "asc" }

王大呀呀的博客 404

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 375

Pspice安装教程:Windows系统完整指南(含环境变量设置)

详细讲解在Windows系统中完成Pspice安装的全过程,涵盖安装步骤与关键的环境变量设置,帮助用户顺利运行仿真工具。适合初学者快速上手pspice安装教程中的核心环节。

weixin_42230607的博客 1174

scrapling 官网教程

选择使用方法查找元素访问元素的数据Navigation 导航抓取网站内容HTTP 请求动态加载的网站动态加载,并且有防护的网站。

freeking101的博客 1108

由浅入深理解Latent Diffusion/Stable Diffusion(5):利用预训练模型快速开始自己的科研任务

从零开始训练一个stable diffusion大概需要16万美元和1个月的时间,这对于一般的科研工作者来说难以承受,所以如何利用预训练模型快速开始自己的科研训练是一个非常有价值的问题。这篇博客将演示如何利用预训练模型快速开始自己的科研任务,希望对大家有所帮助!

沉迷单车的追风少年 3367

Windows服务彻底删除指南:从SC命令到编程实现

Windows服务是操作系统后台运行的核心组件,由服务控制管理器(SCM)统一管理。其注册信息存储在系统注册表深处,生命周期管理比普通应用复杂。理解服务删除的本质,关键在于掌握注册表项清理、权限控制与依赖处理等底层原理。这项技能对于系统运维、软件开发和环境清理具有重要价值,能有效解决软件卸载残留、测试服务清理等实际问题。本文聚焦于Windows服务删除,详细解析了使用SC命令、PowerShell以及C#编程等多种方法,并针对服务残留、文件锁定等常见场景提供了解决方案。

weixin_30797199的博客 341

Android系统开发面试指南:系统Launcher岗位解析

本文针对上海礼聪Android系统开发岗位(侧重系统Launcher、充电/电池/USB底层开发)提供面试指南。内容涵盖应用开发(启动流程优化)、系统底层(充电状态机、USBOTG)、编程能力(线程安全LRU实现)、问题排查(ANR分析)及沟通协作等核心考点。通过5类典型问题及技术深度解析,帮助候选人系统准备,重点考察Framework源码理解、系统调试能力和工程思维。建议结合PowerManagerService等模块源码和systrace工具进行实践准备,同时注重技术表达与协作能力的展现。

郑伟强dev的专栏 927

西门子PLC编程之⑦编程开始之点位配置及注释

紧接上篇,点位梳理后,进入PLC编程。1、新建工程,配置系统模块2、配置I点并做中文符合,直接上中文,smart支持中文点位编程,用起来很方便。3、配置Q点并做中文符合5、配置AIW模拟量输入点,配置AQW模拟量输出点并做中文符合6、配置手动启动辅助触点,并做中文符合7、 配置自动启动辅助触点,并做中文符合8、 配置传感器浮点型数据变量点位,并做中文符合9、配置系统运行参数设置区点位,做中午符合,做掉电保持.....................

学技术,人生不误——谁也是寂寞宇宙里的流星,只是你的坚持决定了你划过的痕迹。而且,铸造了普遍里的你的唯一。 4888

爬虫教程( 4 ) --- scrapy-redis、集群、curl-cffi、scrapy-stealth、aio-scrapy、omnicrawl-core、反检测(反爬)浏览器

分布式爬虫 scrapy-redis、集群

freeking101的博客 6822

嵌入式代码审计中常见的漏洞(四)

经过漫长时间的迭代更新,内容从一开始的碎片化网罗搜集,到排版与整合划分,再到学习与实践验证,最后摒弃初始,用自己的语言与实践结论通俗的将它展现出来。强化知识技能的同时也为读者带来更好的阅读体验。 本篇介绍了以下代码安全问题: 编号 漏洞 1 敏感信息硬编码 2 未初始化安全 3 越界访问 4 迭代器失效 5 迭代器尾部解引用

武天旭的博客 3314

goalng开发_开发篇

Go 面试,基础知识

qq_46640341的博客 1159

PCL RANSAC拟合直线并插值

空间直线线性插值的原理与实现方法。

点云侠的博客 136

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

爬虫教程( 2 ) --- scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

freeking101的博客 5249

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Elasticsearch 入门教程 – (混合起来)短语匹配与混合起来
下一篇: Elasticsearch 入门教程 – 精确搜索
springdk2009
博客等级 码龄17年 1835粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值