Elasticsearch对复杂嵌套查询的应用-nested

es客户端工具嵌套查询通俗解释:nested类型检索方法 通过es客户端工具操作nested类型数据时,需使用特定语法匹配嵌套结构。普通查询无法触及内部对象,必须借助nested查询才能精准检索数组中的字段,避免数据遗漏。 阅读详情

创建索引

PUT /area
{
  "mappings": {
    "_doc": {
      "properties": {
        "province": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "text",
              "analyzer": "ik_max_word"
            },
            "cities": {
              "type": "nested",
              "properties": {
                  "name": {
                "type": "text",
                "analyzer": "ik_max_word"
              },
                "district": {
                  "type": "nested",
                  "properties": {
                    "name": {
                      "type": "text",
                      "analyzer": "ik_max_word"
                    }
                  }
                }
              }
            
            }
          }
        }
      }
    }
  }
}

插入示例数据

PUT /area/_doc/1
{
  "province": {
    "name": "北京",
    "cities": [
      {
        "name": "北京市",
        "district": [
          {
            "name": "朝阳区"
          },
          {
            "name": "海淀区"
          },
          {
            "name": "丰台区"
          },
          {
            "name": "大兴区"
          },
          {
            "name": "房山区"
          },
          {
            "name": "通州区"
          },
           {
            "name": "延庆区"
          },
           {
            "name": "昌平区"
          },
           {
            "name": "密云区"
          },
           {
            "name": "平谷区"
          }
        ]
      }
    ]
  }
}

示例2

PUT /area/_doc/2
{
  "province": {
    "name": "辽宁省",
    "cities": [
      {
        "name": "沈阳市",
        "district": [
          {
            "name": "和平区"
          },
          {
            "name": "皇姑区"
          },
          {
            "name": "沈河区"
          },
          {
            "name": "铁西区"
          },
          {
            "name": "浑南区"
          },
          {
            "name": "苏家屯区"
          },
           {
            "name": "沈北新区"
          },
           {
            "name": "大东区"
          },
           {
            "name": "辽中区"
          },
           {
            "name": "于洪区"
          }
        ]
      },
      {
        "name":"葫芦岛市",
       "district":[
         {"name":"连山区"},
         {"name":"龙港区"},
         {"name":"男票区"}
         ]
      }
    ]
  }
}

使用java完成对复杂嵌套的搜索

package com.cn.service.impl;

import com.cn.ES.ESManager;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.*;

public class ProvinceInfoSearch {

    public static void search() throws Exception {
        String indexName = "area";
        //ES连接
        Client client = ESManager.ESClient();
        String path="province.cities.district.name";

        MatchQueryBuilder  districtQuery= QueryBuilders.matchQuery("province.cities.district.name", "浑南");

        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.should(QueryBuilders.matchQuery("province.cities.name","北京"));
        NestedQueryBuilder districtQueryNested = QueryBuilders.nestedQuery("province.cities.district", districtQuery, ScoreMode.None);
        boolQueryBuilder.should(districtQueryNested);
        NestedQueryBuilder province_city = QueryBuilders.nestedQuery("province.cities", boolQueryBuilder, ScoreMode.None);

        NestedQueryBuilder provinceQueryBuilder = QueryBuilders.nestedQuery("province", province_city, ScoreMode.None);
        SearchRequestBuilder srb = client.prepareSearch(indexName);
        SearchResponse searchResponse = srb.setQuery(provinceQueryBuilder).get();
        System.out.println(1111);

    }

}


查询语句:

GET area/_search
{
  "query": {
    "nested": {
      "path": "province",
      "query": {
        "nested": {
          "path": "province.cities",
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "province.cities.name": "北京"
                  }
                },
                {
                 "nested": {
                   "path": "province.cities.district",
                   "query": {
                     "match": {
                       "province.cities.district.name": "浑南"
                     }
                   }
                 }
                }
              ]
            }
            
            
          }
        }
        
      }
    }
    
    
  }
}

searchResponse 中包含的查询结果:

{
    "took": 15,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "_clusters": {
        "total": 0,
        "successful": 0,
        "skipped": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0,
        "hits": [
            {
                "_index": "area",
                "_type": "_doc",
                "_id": "2",
                "_score": 0,
                "_source": {
                    "province": {
                        "name": "辽宁省",
                        "cities": [
                            {
                                "name": "沈阳市",
                                "district": [
                                    {
                                        "name": "和平区"
                                    },
                                    {
                                        "name": "皇姑区"
                                    },
                                    {
                                        "name": "沈河区"
                                    },
                                    {
                                        "name": "铁西区"
                                    },
                                    {
                                        "name": "浑南区"
                                    },
                                    {
                                        "name": "苏家屯区"
                                    },
                                    {
                                        "name": "沈北新区"
                                    },
                                    {
                                        "name": "大东区"
                                    },
                                    {
                                        "name": "辽中区"
                                    },
                                    {
                                        "name": "于洪区"
                                    }
                                ]
                            },
                            {
                                "name": "葫芦岛市",
                                "district": [
                                    {
                                        "name": "连山区"
                                    },
                                    {
                                        "name": "龙港区"
                                    },
                                    {
                                        "name": "男票区"
                                    }
                                ]
                            }
                        ]
                    }
                }
            },
            {
                "_index": "area",
                "_type": "_doc",
                "_id": "1",
                "_score": 0,
                "_source": {
                    "province": {
                        "name": "北京",
                        "cities": [
                            {
                                "name": "北京市",
                                "district": [
                                    {
                                        "name": "朝阳区"
                                    },
                                    {
                                        "name": "海淀区"
                                    },
                                    {
                                        "name": "丰台区"
                                    },
                                    {
                                        "name": "大兴区"
                                    },
                                    {
                                        "name": "房山区"
                                    },
                                    {
                                        "name": "通州区"
                                    },
                                    {
                                        "name": "延庆区"
                                    },
                                    {
                                        "name": "昌平区"
                                    },
                                    {
                                        "name": "密云区"
                                    },
                                    {
                                        "name": "平谷区"
                                    }
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}
【Elasticsearch从入门到精通】第23篇:Elasticsearch嵌套搜索与命中展示——inner_hits与nested查询 摘要 Elasticsearch嵌套查询机制解析:针对对象间复杂层级关系(如博客评论、订单商品等),Elasticsearch提供了nested类型、join父子关系和inner_hits三种核心解决方案。本文重点剖析:1)nested对象类型如何避免数组对象扁平化存储导致的错误匹配;2)nested查询语法及inner_hits展示匹配嵌套文档的机制;3)has_child/has_parent实现父子文档关联查询;4)total hits结构中relation字段的语义差异;5)search_type参 阅读详情

相关推荐

Elasticsearch中的嵌套查询技巧

本文介绍了在Elasticsearch中使用多个嵌套查询实现AND条件查询的方法。通过酒店设施查询案例,解释了嵌套字段的特性,并对比了错误查询与正确查询的区别。关键解决方案是为每个条件创建独立嵌套查询,确保同时匹配多个嵌套对象。该方法适用于需要精确匹配的场景,帮助开发者准确实现复杂查询需求。

2501_90323865的博客 70

深入了解ElasticSearch的Nested数据类型

深入了解ElasticSearch的Nested数据类型

Java鱼仔的博客 1万+

生信入门第七课:使用FastQC软件进行测序原始fastq数据质控

从实验到数据:RNA定量、文库片段长度、fastqc质控和fastp去接头

微生信 487

Elasticsearch:运用 Java 对索引进行 nested 搜索

在我之前的文章 “Elasticsearch: nested 对象”,我详细地描述了如何使用 nested 数据类型来进行搜索及聚合。 Elasticsearch 不是关系数据库!nested 数据类型是一种可以描述数据关系的一种类型。简单地说,nested是一种特殊的字段数据类型,它允许对象数组以一种可以相互独立查询的方式进行索引。如果你的数据字段里: 含有数组数据 在查询或聚合的时候可能会使用到这个字段里的两个及以上的子字段进行查询 在这种情况下,我们需要使用到 nested 数据类型。 N.

Elastic 中国社区官方博客 4358

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 431

Unity游戏Google Play闪退?可能是这个隐藏设置惹的祸(附完整解决方案)

本文深度解析Unity游戏在Google Play上出现闪退的疑难问题,指出其根源可能在于Google Play后台的“应用完整性”设置与游戏原生库的冲突。文章提供了从崩溃日志分析、本地与线上版本对比测试,到调整Unity构建设置、审查第三方插件以及优化分发包配置的系统性排查与根治方案,帮助开发者彻底解决这一隐蔽问题。

weixin_29213827的博客 234

elasticsearch笔记五:2024最新版ES8Java客户端-Elasticsearch Java 的client API 操作 Elasticsearch client 8.0

低级别的 REST 客户端,通过 http 与集群交互,用户需自己编组请求 JSON 串,及解析响应 JSON 串。兼容所有 ES 版本。高级别的 REST 客户端,基于低级别的 REST 客户端,增加了编组请求 JSON 串、解析响应 JSON 串等相关 api。使用的版本需要保持和 ES 服务端的版本一致,否则会有版本问题。

LoveSummer 2万+

字节跳动扣子AI应用开发平台之实战

推出背景:扣子平台由字节跳动推出,旨在让非开发者也能快速创建、调试和优化聊天机器人。上线时间:扣子平台于2024年2月1日正式上线。功能定位:扣子是一个AI聊天机器人和应用程序编辑开发平台,可以理解为字节跳动版的GPTs。

恩爸编程 5897

Java操作ElasticSearch客户端实现高级查询

java连接ElasticSearch8.4.1客户端;实现各种聚合查询操作

weixin_43407520的博客 4782

41-dify案例分享-基于database插件实现Text2sql的数据库查询图表工作流

本文介绍基于 Text2SQL 的 Dify 工作流实现过程。先阐述 Text2SQL 概念、步骤及应用领域。接着说明工作流制作,包括用 chatflow 加开场白、获取系统时间,配置 LLM 生成 SQL,用 SQL Execute 工具查询,经 LLM 汇总结果,代码生成 ECharts 数据,条件分支判断图表类型输出。最后介绍验证测试、提供体验地址,还提及借助工具生成建表和初始化数据 SQL 语句。

个人技术 1万+

虚拟机ubuntu22.04.3中安装vitis2024.1注意事项

虚拟机ubuntu安装vitis2024.1

qq_52033578的博客 2495

ElasticSearch8.4.3 Springboot 复杂查询

查询十月份手机类型数据: 统计10月手机,不同类型,不同级别,平均价格 统计10月手机,不同类型,不同级别,平均价格最低的手机以及价格

qq_34125999的博客 1666

OpenLayers6入门,快速搭建Vue+OpenLayers地图脚手架项目

本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。本章会详细讲解从环境到环境的各个步骤,再到使用脚手架快速生成项目,以及添加地图库依赖,编写简单的高德地图显示页面的。如果已有VUE项目或者熟悉VUE的读者可以不用看本章,直接添加ol依赖到VUE项目中即可。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 5440

es-复杂查询Nested和父子文档查询join

es-复杂查询Nested和父子文档查询join

leveretz的博客 3700

【DEIM创新改进】独家下采样创新改进篇 | ECCV 2026 | DEIM 引入FSD-Down频域-空间动态下采样,在下采样过程中保留小目标的高频信息、助力小目标检测、遥感小目标检测有效涨点

🔥本文提出了一种名为FSD-Down的频域-空间动态下采样模块,用于改进DEIM网络模型在小目标检测中的性能。FSD-Down通过小波分解显式保留低频语义和高频细节,结合分组卷积、动态通道权重和可学习缩放因子,自适应强化目标边缘与纹理特征。该模块能有效减轻传统下采样造成的频率混叠和细节丢失,提升对小目标、密集目标和低对比度目标的检测能力。实验表明,FSD-Down计算开销可控,在保持实时性的同时显著提升检测精度,特别是在VisDrone和AITODv2数据集上对小目标的检测性能提升显著。

Ai缝合怪、助力小伙伴高效发论文 82

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ElasticSearch嵌套对象查询完全指南:从错误示范到正确实践

你是否曾在ElasticSearch(以下简称ES)中遇到过这样的困境:明明查询条件都正确,却返回了不符合预期的结果?特别是当处理包含数组对象的数据时,这种情况尤为常见。本文将深入探讨ES中嵌套对象(Nested Object)查询的核心原理,从错误示范到正确实践,帮助你彻底掌握这一关键技术点。 读完本文后,你将能够: - 理解ES处理数组对象的默认行为及其局限性 - 掌握嵌套对象的正确映射(M...

gitblog_00685的博客 485

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

一、什么是 ES Nested 嵌套Elasticsearch 有很多数据类型,大致如下:基本数据类型: string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。 数据类型:integer、long 等 时间类型、布尔类型、二进制类型、区间类型等 复杂数据类型: 数组类型:Array 对象类型...

weixin_39542514的博客 2752

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java查询ES,普通查询和嵌套查询同时存在

1、近期开发涉及到了ES搜索引擎的使用,涉及到的数据结构比较复杂,父子结构中还有嵌套查询。使用的是ElasticSearchTemplate设置SearchQuery对ES进行条件查询。当查询条件中有普通查询和嵌套查询同时存在时,出现了问题: 1.1 所有条件都为NestQueryBuilder时,设置的所有条件都会去Nested的path去查询符合条件的数据,当嵌套内容中没有对应的字段时,查询出...

AirJoker的博客 6261

【限时免费】 Easy-ES中使用Nested类型字段的注意事项与解决方案

在Elasticsearch的实际应用中,嵌套类型(Nested)是处理复杂对象数组的重要数据类型。本文将以Easy-ES框架为例,详细介绍如何正确使用Nested类型字段,以及开发过程中可能遇到的典型问题。 ## 一、Nested类型的基本特性 Nested类型是Elasticsearch中用于处理对象数组的特殊数据类型。与普通对象数组不同,Nested类型会将数组中的每个对象作为独立文档存

gitblog_01409的博客 508

Elasticsearch嵌套对象(nested)的使用

假设我们有一份用户信息,用户信息有一个字段存储用户的社交网络帐号信息。我们知道现在每个人都会有很多SNS账户,例如:QQ,微信,微博,知乎之类。具体到每个SNS帐号,有可以包含很多信息,例如: snsType int #标识sns类型 snsName string #该sns的名称,如QQ,微信 nickname string #用户昵称 fansCnt long...

fanzitao的专栏 5233

ElasticSearch SQL转DSL

前文 Elasticsearch在较高版本中内置SQL查询的功能,猜想本质上应该是将SQL语句转化为原生的DSL语句,再使用原生进行查询,可以让不熟悉ES的用户能通过SQL语句快速查询结果,降低使用门槛减少学习成本。另外,ES也提供Java客户端以JDBC的方式连接查询,但该方式是收费的。所以,如果用户不想购买服务建议使用官方提供的免费的restful的方式去查询,例如Java REST Client。当不熟悉ES原生的DSL语句的时候,可以先使用SQL编写查询语句,然后再使用ES自带的请求将SQL语句翻

hudeyong926的专栏 4864

es内嵌文档查询_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

一、什么是 ES Nested 嵌套Elasticsearch 有很多数据类型,大致如下:基本数据类型:string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。数据类型:integer、long 等时间类型、布尔类型、二进制类型、区间类型等复杂数据类型:数组类型:Array对象类型:ObjectNes...

weixin_39557583的博客 670

一起学Elasticsearch系列-Nested & Join

ES的 Nested 类型用于处理在一个文档中嵌套复杂的结构数据,而 Join 类型用于建立父子文档之间的关联关系

BookSea的博客 1827

elasticsearch nested嵌套对象全文检索和排序

什么是 ES Nested 嵌套类型? Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。 数据类型:integer、long 等 时间类型、布尔类型、二进制类型、区间类型等 复杂数据类型: 数组类...

maso88的专栏 7531

Easy-Es实战教程:如何优雅处理嵌套文档与父子关系

在现代搜索引擎应用开发中,处理复杂数据结构是提升查询效率的关键。Easy-Es作为一款高效的Elasticsearch ORM框架,提供了简洁的API来处理嵌套文档和父子关系,帮助开发者轻松应对复杂数据建模需求。本文将通过实战案例,带你掌握Easy-Es中嵌套文档与父子关系的核心用法,让你的Elasticsearch操作更上一层楼。 ## 嵌套文档 vs 父子关系:核心概念解析 在Elasti

gitblog_00631的博客 691
上一篇: springboot内置tomcat报错:Invalid character found in the request target. The valid characters are defined
下一篇: Debian11安装Docker稳定版
javaChengXuY
博客等级 码龄8年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值