博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch 组合过滤器
阅读量:5886 次
发布时间:2019-06-19

本文共 1883 字,大约阅读时间需要 6 分钟。

  1、布尔过滤器

    前篇文章中()的两个例子都是单个过滤器(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 语句之中,所以返回的命中文档要必须都能同时匹配这两个条件。

 

转载地址:http://rngix.baihongyu.com/

你可能感兴趣的文章
禁止匿名VSFTP用户登录
查看>>
Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
查看>>
Oracle 10g
查看>>
Mahout数据承载
查看>>
Linux:alias 起别名
查看>>
Spring Boot 中使用 RocketMQ
查看>>
我的友情链接
查看>>
day01:shell基础(shell基础、alias及重定向)
查看>>
CockroachDB搭建及简单性能测试情况
查看>>
sitemesh3 源码分析
查看>>
centos7.2部署vnc服务记录
查看>>
Web的项目管理工具Redmine(对比选择最佳开源项目)- Codendi,dotProject,Launchpad,Project.net,Redmine...
查看>>
Linux基础(十)--bash脚本简介
查看>>
Cocos2d-x Android开发环境的配置
查看>>
NTP
查看>>
扩展根目录空间
查看>>
簡單收所有經過網卡的包 promiscuous mode GNU Linux
查看>>
高性能高并发--分布式,集群
查看>>
git获取远程分支
查看>>
文字与格式字符串不匹配
查看>>