elasticSearch nested exist与missing查询

简介: elasticSearch nested查询,简单意义上,你可以理解为,它不会被索引,只是被暂时隐藏起来,而查询的时候,开关就是使用nested query/filter去查询下面我有一个例子,是查询文档中,含有某字段的nested查询,与不含有某字段的nested查询办法。

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

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

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

ES查询语句

核心


{
              "query": {
                "nested": {
                  "path": "account",
                  "query": {
                    "match_all": {}
                  },
                  "filter": {
                    "exists": {
                      "field": "account.userId"
                    }
                  }
                }
              }
}
AI 代码解读

java查询语句


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

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"}}}}}]}}}}}'
AI 代码解读

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

ES查询语句

核心


{
          "not":{
            "nested" : {
              "query" : {
                "filtered" : {
                  "query" : {
                    "match_all" : { }
                  },
                  "filter" : {
                    "exists" : {
                      "field" : "account.userId"
                    }
                  }
                }
              },
              "path" : "account"
            }
            }
 }
AI 代码解读

java代码


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

//添加Not
FilterBuilders.notFilter(nfb);
AI 代码解读

完整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"]}}]}}]}}}}}'
AI 代码解读

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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
打赏
0
0
0
0
19
分享
相关文章
|
5月前
|
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
86 4
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
87 0
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
79 0
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
210 1
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
123 0
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 高亮查询
93 0
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - filter查询
69 0
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - 复合查询
82 0
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
170 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等