Elasticsearch 入门教程 – bool 过滤器

这篇具有很好参考价值的文章主要介绍了Elasticsearch 入门教程 – 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} 
              }
           }
         }
      }
   }
}

bool filter,服务器,elasticsearch,java,spring

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

bool filter,服务器,elasticsearch,java,spring

 

bool filter,服务器,elasticsearch,java,spring

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

bool filter,服务器,elasticsearch,java,spring

如果一个产品的价格是 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"
        }
    }
]

bool filter,服务器,elasticsearch,java,spring

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

bool filter,服务器,elasticsearch,java,spring

与 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}} 
                  ]
                }}
              ]
           }
         }
      }
   }
}

bool filter,服务器,elasticsearch,java,spring

 

bool filter,服务器,elasticsearch,java,spring

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

bool filter,服务器,elasticsearch,java,spring

 

bool filter,服务器,elasticsearch,java,spring

这两个 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" 
        }
    }
]

bool filter,服务器,elasticsearch,java,spring

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

bool filter,服务器,elasticsearch,java,spring

 

bool filter,服务器,elasticsearch,java,spring

这两个字段与嵌套的 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());

        }

这只是个简单的例子,但足以展示布尔过滤器可以用来作为构造复杂逻辑条件的基本构建模块。文章来源地址https://www.toymoban.com/news/detail-861409.html

到了这里,关于Elasticsearch 入门教程 – bool 过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【ES】Elasticsearch:词干、Shingles 和同义词过滤器

    分词器生成的分词可能需要进一步丰富或增强,例如小写(或大写)标记、提供同义词、开发词干词、删除撇号或标点符号等。 分词过滤器对分词进行处理以执行此类转换。 Elasticsearch 提供了将近 50 个分词过滤器,正如你可以想象的那样,在这里讨论所有这些过滤器是不可

    2024年02月05日
    浏览(11)
  • Linux安装Elasticsearch(手把手入门教程及下载资源)

    Linux安装Elasticsearch(手把手入门教程及下载资源)

    介绍Elasticsearch: 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心) Restful风格,一切API都遵循Rest原则,容易上手 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的 官网地址 点击进入官网点击去体验 下拉找到该模块点击下载 选择系统类型,点

    2023年04月08日
    浏览(13)
  • Elasticsearch教程—Elasticsearch Java API Client [8.6]开发入门(官方原版)

    大家好,我是Doker! Java 8 或更高版本。 一个 JSON 对象映射库,允许无缝集成 您的应用程序类与 Elasticsearch API 一起。Java 客户端具有 支持 Jackson 或 Eclipse Yasson 等 JSON-B 库。 Java API客户端由三个主要组件组成: API客户端类。这些为Elasticsearch API提供了强类型的数据结构和方法。

    2024年02月13日
    浏览(10)
  • 552、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19

    1.1 简单介绍 之前是对ES中的创建/查看/删除索引、创建定义映射、创建/查看/修改/删除文档的这些操作有了一定的了解认识,但是是通过Postman + JSON串的方法来实现的 那么之后仍然是对ES中的索引、映射、文档进行操作,只是方法换成了Java API。 1.2 案例详情 首先需要创建一个

    2024年02月08日
    浏览(11)
  • 551、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

    551、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

    1.1 Elasticsearch中的数据格式 Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比。 ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。

    2023年04月11日
    浏览(10)
  • Spring Cloud Gateway快速入门(三)——过滤器

    Gateway过滤器是Spring Cloud Gateway提供的一种机制,用于对进入网关的请求和返回进行处理和转换。它可以用于实现各种功能,如请求鉴权、请求转发、请求限流、请求重试等。 网关过滤器是Spring Cloud Gateway提供的一种机制,用于在请求进入网关和响应离开网关时进行一些预处理

    2024年02月04日
    浏览(26)
  • Django基础入门⑥:Django过滤器和标签讲解

    Django基础入门⑥:Django过滤器和标签讲解

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django过滤器是

    2024年02月11日
    浏览(11)
  • Vue 中过滤器 filter 使用教程

    1.1 过滤器使用的背景    过滤器 提供给我们的一种 数据处理方式 。过滤器功能不是必须要使用的,因为它所实现的功能也能用 计算属性 或者 函数调用 的方式来实现。   例如我们要在页面显示格式化的时间样式,如图所示:下面三种格式化的时间格式都是由 时间戳

    2024年02月07日
    浏览(10)
  • Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

    Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

    Elasticsearch 是一个分布式搜索和分析引擎,它使用JSON文档来存储数据。索引是Elasticsearch中数据的基本组织单元之一,下面是Elasticsearch索引相关的基本概念: 结构元素 Elasticsearch MySQL 数据库 索引(Index) 数据库(Database) 表格 类型(Type)* 表(Table) 记录/行 文档(Document)

    2024年02月03日
    浏览(12)
  • 大数据学习初级入门教程(十七) —— Elasticsearch 8.7.0 完全分布式集群的安装、配置、启动和测试

    大数据学习初级入门教程(十七) —— Elasticsearch 8.7.0 完全分布式集群的安装、配置、启动和测试

    好久没用 Elasticsearch 集群了,参考以前写的《大数据学习初级入门教程(八) —— Elasticsearch 7.6.2 单节点的安装、启动和测试_elasticsearch 7.6.2需要专属网络_孟郎郎的博客-CSDN博客》、《大数据学习初级入门教程(九) —— Elasticsearch 7.6.2 伪分布式集群的安装、配置、启动和测

    2024年02月04日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包