• ElasticSearch 组合过滤器


      1、布尔过滤器

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

        

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

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

        

        

        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" :
       {
          "bool" : 
          {
                  "should" : 
                  [
                     { "term" : {"price" : 20}}, 
                     { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
                  ],
                  "must_not" : {"term" : {"price" : 30} }
          }
       }
    }

        

        

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

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

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

     

      2、嵌套布尔过滤器

        

        尽管 bool 是一个复合的过滤器,可以接受多个子过滤器,需要注意的是 bool 过滤器本身仍然还只是一个过滤器。 这意味着我们可以将一个 bool 过滤器置于其他 bool 过滤器内部,

        这为我们提供了对任意复杂布尔逻辑进行处理的能力。

        对于以下这个 SQL 语句:

        

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

    GET /my_store/products/_search
    {
       "query" :
       {
          "bool" : 
          {
                  "should" : 
                  [
                     { "term" : {"productID" : "XHDK-A-1293-#fJ3"}},
                     { "bool" : 
                        { 
                          "must" : 
                          [
                            { "term" : {"productID" : "JODL-X-1937-#pV7"}}, 
                            { "term" : {"price" : 30}} 
                          ]
                        }
                     }
                  ]
          }
       }
    }

        

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

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

  • 相关阅读:
    【转】配置BT5中文环境
    Jaspersoft iReport Designer 4.7.0 导出pdf 中文不显示的解决办法
    JS通过get、post向jsp传递中文出现乱码的问题的解决
    从 相机 或者相册 获取图片显示在ImageView 上
    简单几段代码实现窗口抖动
    android 塔防游戏汇总 及android 游戏开发索引
    android 音乐播放器汇总
    android Style应用
    android手机控制电脑源码
    【Android通过手势实现的缩放处理】
  • 原文地址:https://www.cnblogs.com/shaosks/p/7567336.html
Copyright © 2020-2023  润新知