elasticSearch nested exist与missing查询

elasticSearch nested查询,简单意义上,你可以理解为,它不会被索引,只是被暂时隐藏起来,而查询的时候,开关就是使用nested query/filter去查询

下面我有一个例子,是查询文档中,含有某字段的nested查询,与不含有某字段的nested查询办法。

1.查询文档中存在某字段(account.userId)的nested

ES查询语句

核心


{
              "query": {
                "nested": {
                  "path": "account",
                  "query": {
                    "match_all": {}
                  },
                  "filter": {
                    "exists": {
                      "field": "account.userId"
                    }
                  }
                }
              }
}

java查询语句


//构建Nested查询
NestedFilterBuilder nfb = FilterBuilders.nestedFilter("account", QueryBuilders.filteredQuery(
                            QueryBuilders.matchAllQuery(), FilterBuilders.existsFilter("account.userId")));
                     

nfb嵌入到原有的查询query中即可

完整查询



{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "and" : {
          "filters" : [ {
            "range" : {
              "oppType" : {
                "from" : 20,
                "to" : null,
                "include_lower" : true,
                "include_upper" : true
              }
            }
          }, {
            "term" : {
              "city" : 1
            }
          }, {
            "range" : {
              "status" : {
                "from" : 0,
                "to" : 12,
                "include_lower" : true,
                "include_upper" : false
              }
            }
          }, {
            "nested" : {
              "query" : {
                "filtered" : {
                  "query" : {
                    "match_all" : { }
                  },
                  "filter" : {
                    "exists" : {
                      "field" : "ajkAccount.ajkUserId"
                    }
                  }
                }
              },
              "path" : "ajkAccount"
            }
          }, {
            "or" : {
              "filters" : [ {
                "term" : {
                  "saleId" : "xxx"
                }
              }, {
                "terms" : {
                  "deptId" : [ "dept001" ]
                }
              } ]
            }
          } ]
        }
      }
    }
  }
}

curl -XPOST 'http://192.168.1.xx:9200/xxxIndex/xxxEntry/_search' '{"query":{"filtered":{"query":{"match_all":{}},"filter":{"and":{"filters":[{"range":{"oppType":{"from":null,"to":20,"include_lower":true,"include_upper":false}}},{"term":{"city":1}},{"range":{"status":{"from":0,"to":11,"include_lower":true,"include_upper":true}}},{"query":{"nested":{"path":"account","query":{"match_all":{}},"filter":{"exists":{"field":"account.userId"}}}}}]}}}}}'

2.查询文档中不存在某字段(missing account.userId)的nested

ES查询语句

核心


{
          "not":{
            "nested" : {
              "query" : {
                "filtered" : {
                  "query" : {
                    "match_all" : { }
                  },
                  "filter" : {
                    "exists" : {
                      "field" : "account.userId"
                    }
                  }
                }
              },
              "path" : "account"
            }
            }
 }

java代码


//构建Nested查询
NestedFilterBuilder nfb = FilterBuilders.nestedFilter("account", QueryBuilders.filteredQuery(
                            QueryBuilders.matchAllQuery(), FilterBuilders.existsFilter("account.userId")));

//添加Not
FilterBuilders.notFilter(nfb);

完整ES查询


{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "and" : {
          "filters" : [ {
            "range" : {
              "oppType" : {
                "from" : 20,
                "to" : null,
                "include_lower" : true,
                "include_upper" : true
              }
            }
          }, {
            "term" : {
              "city" : 1
            }
          }, {
            "range" : {
              "status" : {
                "from" : 0,
                "to" : 12,
                "include_lower" : true,
                "include_upper" : false
              }
            }
          }, {
            "not" : {
              "filter" : {
                "nested" : {
                  "query" : {
                    "filtered" : {
                      "query" : {
                        "match_all" : { }
                      },
                      "filter" : {
                        "exists" : {
                          "field" : "account.userId"
                        }
                      }
                    }
                  },
                  "path" : "account"
                }
              }
            }
          }, {
            "or" : {
              "filters" : [ {
                "term" : {
                  "saleId" : "xxxxx"
                }
              }, {
                "terms" : {
                  "deptId" : [ "dept01" ]
                }
              } ]
            }
          } ]
        }
      }
    }
  }
}


curl -XPOST 'http://192.168.1.xx:9200/xxxIndex/xxxEntry/_search' '{"query":{"filtered":{"query":{"match_all":{}},"filter":{"and":{"filters":[{"range":{"oppType":{"from":20,"to":null,"include_lower":true,"include_upper":true}}},{"term":{"city":1}},{"range":{"status":{"from":0,"to":12,"include_lower":true,"include_upper":false}}},{"not":{"filter":{"nested":{"query":{"filtered":{"query":{"match_all":{}},"filter":{"exists":{"field":"account.userId"}}}},"path":"account"}}}},{"or":{"filters":[{"term":{"saleId":"xxxxx"}},{"terms":{"deptId":["dept01"]}}]}}]}}}}}'

参考
http://grokbase.com/t/gg/elasticsearch/13a49a2hmq/check-if-field-exists-in-a-nested-object
https://github.com/elastic/elasticsearch/issues/3495 `

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/255610

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。