Elasticsearch对复杂嵌套查询的应用-nested-程序员秘密

技术标签: 中文分词  elasticsearch  

创建索引

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": "平谷区"
                                    }
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/javaChengXuY/article/details/124298475

智能推荐

推荐算法-协同过滤(Collaborative Filtering)-相似度_协同过滤算法的预测公式_zhangztSky的博客-程序员秘密

推荐算法推荐模型构建流程推荐算法概述基于协同过滤的推荐算法协同过滤实现一 推荐模型构建流程Data(数据)->Features(特征)->ML Algorithm(机器学习算法)->Prediction Output(预测输出)数据清洗/数据处理数据来源显性数据Rating 打分Comments 评论/评价隐形数据Order history 历史订单Cart events 加购物车Page views 页面浏览Click-t

全电发票开票接口_Michael__mai的博客-程序员秘密

全电发票自动开票的实现,全电发票开票接口文档说明

使用while、do-while以及for循环计算100以内(包括100)的偶数之和_用while语句求100以内偶数之和_《码赛客》的博客-程序员秘密

package pinduoduo;public class oushuzhihe { public static void main(String[] args) { /*使用while、do-while以及for循环三种编程方式实现: * 计算100以内(包括100)的偶数之和 * */for循环 int num=0; for (int i = 1; i <=100; i++) { ...

关于python路径的转义问题_python 路径转义_spacecraft111的博客-程序员秘密

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

Cadence OrCAD 导出BOM/编辑原理图库时的复制与粘贴_cadence原理图怎么复制粘贴_silent_dusbin的博客-程序员秘密

大公司可以有专门的数据原维护CIS数据库,不会出现这种问题。小公司或个人就需要手动添加料号。1.在OrCAD里填加料号/物料描述/供应商型号在下面这个图中增加一列,点击New Property一般命名成Part Number。物料描述Description供应商型号Manufacturer Code我个人喜欢再添加一列物料属性有些物料不在BOM上体现,比如NC的电容电阻,我们可以新增一个NoBOM的属性。Tools - > Bill of MaterialsHeader这

电子发票XML样式_七月在野的博客-程序员秘密

电子发票XML样式文章目录电子发票XML样式一、航信1、专普票2、电子发票二、百望、UKey1、专普票2、电子发票提示:以下是各开票软件导入xml开票格式一、航信1、专普票格式如下:<?xml version="1.0" encoding="GBK"?><Kp><Version>2.0</Version><Fpxx><Zsl>1</Zsl><Fpsj><Fp><Djh&gt

随便推点

如何基于DEM高程数据提取生成等高线的教程_android解析高程dem数据_arceyes1的博客-程序员秘密

越来越多的水经注软件新老用户经常提出这样一些问题,如:  如何下载谷歌地球上的高程数据?  谷歌地表地形图下载器可以下载等高线吗?  你们有谷歌高程数据采集工具软件吗?  首先需要说明的是,其实我们没有必要从谷歌地球上去下载高程数据,它不是原始的,是经过谷歌加工处理后的,由于各种参数的不确定性,采集到的高程点不一定准确,速度也慢,下载后的数据存储格式还很有限。  我们公司有全球

文章标题_Zhaozetu的博客-程序员秘密

一号标题二号标题三号标题斜体 斜体 粗体 粗体 粗斜体 应用 嵌套引用 删除 链接blog: http://www.baidu.com 百度链接使用方式 百度var a这是一段代码p{text-indent:2em;}无序列表 - 1 - 2 - 3 2. 5. 7.

使用EasyPoi根据权限动态导出列——反射实现_easypoi动态列导出_圈T社区的博客-程序员秘密

前言: 前段时间,因为业务需求需要根据用户角色动态导出excel,不同角色看到的列不同。以前用到的方法基本是(或者有其他土方法),创建多个实体类,每个实体类对应的列不同,以此来实现动态导出,但显然这是个笨方法,虽然省时省力,但好像总觉得哪里不对。正片开始easypoi链接: EasyPoi官方文档我们使用的注解版的导出 @Excel,官方文档中说明很详细,默认大家都会用,不会用的,copy...

关闭OneNote右下角的图标显示_onenote 关闭托盘_samtaoys的博客-程序员秘密

打开OneNote选择"文件--选项--显示"在显示中将把“将OneNote图标放在任务栏通知区域”的勾选去掉,然后点击“确定”

为ubuntu16.04安装selinux_ubuntu16.04安装 libselinux_kidneybeans的博客-程序员秘密

桌面版:执行apt-get install selinux报错: dpkg: error processing package selinux (--configure)这是因为ubuntu16.04桌面版默认安装apparmor, 它是另一个权限管理模块,与selinux冲突.于是执行apt-get remove apparmor将其卸载即可.arm版:执行apt

JS教程--for、for-in、forEach和for-of四种遍历语法比较_for-loop,for-in,for-of,foreach这四个遍历方法,再遍历很大的数组时谁的性_sara-的博客-程序员秘密

for循环–最原始–最易理解的循环遍历方式–写法繁琐语法:for(var index = 0;index < arr.length;index++){console.log(arr[index])}–使用continue和break可以跳出本次循环和退出循环forEach–写法便利**–每次循环实际上是一个回调函数,因此在函数内部无法用continue和break(用于...