问题描述

es中存在有一个名为task_data_1的索引,其字段映射关系如下所示:
{
"task_data_1" : {
"mappings" : {
"dynamic_templates" : [
{
"dates" : {
"match_mapping_type" : "date",
"mapping" : {
"type" : "date"
}
}
},
{
"doubles" : {
"match_mapping_type" : "double",
"mapping" : {
"type" : "double"
}
}
},
{
"objects" : {
"match_mapping_type" : "object",
"mapping" : {
"type" : "object"
}
}
},
{
"longs" : {
"match_mapping_type" : "long",
"mapping" : {
"type" : "integer"
}
}
},
{
"strings" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword"
}
}
}
],
"properties" : {
"createUsername" : {
"type" : "keyword"
},
"data" : {
"type" : "nested",
"dynamic" : "true",
"properties" : {
"daterange102110" : {
"type" : "date"
},
"input18779" : {
"type" : "keyword"
},
"rate48025" : {
"type" : "integer"
},
"textarea24212" : {
"type" : "keyword"
},
"textarea38172" : {
"type" : "keyword"
},
"timerange47544" : {
"type" : "keyword"
},
"url" : {
"type" : "keyword"
}
}
},
"formId" : {
"type" : "long",
"store" : true
},
"updateUsername" : {
"type" : "keyword"
}
}
}
}
}
通过createUsername、updateUsername、formId等字段可以正常进行过滤查询功能,但是data这个map中的所有字段都无法正常进行过滤查询功能。

解决过程

起初,我是直接用map中对应的字段名进行过滤查询,编写的代码生成的DSL如下所示:
POST task_data_1/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"term": {
"input18779": {
"value": "3213",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"createTime": {
"order": "desc"
}
}
],
"track_total_hits": 2147483647
}
这样子的查询语法有很明显的问题,因为input32768这个字段是嵌套在data这个map中的,直接使用input32768这个字段名是无法查询到对应数据的。
 
发现问题后,我修改了代码逻辑,而后生成的DSL如下所示:
POST task_data_1/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"term": {
"data.input18779": {
"value": "3213",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"createTime": {
"order": "desc"
}
}
],
"track_total_hits": 2147483647
}
这样子的查询语法,从表现上看是没有任何问题的,但依然查不出数据。
 
后来我到kibana查询了该索引的字段映射关系,就是上文中的这一段json数据:
{
"task_data_1" : {
"mappings" : {
"dynamic_templates" : [
{
"dates" : {
"match_mapping_type" : "date",
"mapping" : {
"type" : "date"
}
}
},
{
"doubles" : {
"match_mapping_type" : "double",
"mapping" : {
"type" : "double"
}
}
},
{
"objects" : {
"match_mapping_type" : "object",
"mapping" : {
"type" : "object"
}
}
},
{
"longs" : {
"match_mapping_type" : "long",
"mapping" : {
"type" : "integer"
}
}
},
{
"strings" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword"
}
}
}
],
"properties" : {
"createUsername" : {
"type" : "keyword"
},
"data" : {
"type" : "nested",
"dynamic" : "true",
"properties" : {
"daterange102110" : {
"type" : "date"
},
"input18779" : {
"type" : "keyword"
},
"rate48025" : {
"type" : "integer"
},
"textarea24212" : {
"type" : "keyword"
},
"textarea38172" : {
"type" : "keyword"
},
"timerange47544" : {
"type" : "keyword"
},
"url" : {
"type" : "keyword"
}
}
},
"formId" : {
"type" : "long",
"store" : true
},
"updateUsername" : {
"type" : "keyword"
}
}
}
}
}
从这段json数据中可以发现,data这个map的类型是nested。
 
查资料后得知,在 Elasticsearch 中,"nested" 类型是一种特殊的数据类型,用于处理嵌套文档(nested documents)。
针对这种类型的数据,需要使用 Nested Query 结合 Match Query 或 Term Query 等查询类型来搜索嵌套字段。
 
因此,我对代码做出类似如下整改:
queryBuilder.must(QueryBuilders.nestedQuery("data", QueryBuilders.termQuery(queryFieldName, item.getFilterValue()), ScoreMode.None));
 
主要是使用到了 Nested Query,之后生成的DSL如下所示:
POST task_data_1/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"nested": {
"query": {
"term": {
"data.input18779": {
"value": "3213",
"boost": 1
}
}
},
"path": "data",
"ignore_unmapped": false,
"score_mode": "none",
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"createTime": {
"order": "desc"
}
}
],
"track_total_hits": 2147483647
}
此时,对应的数据结果就能够被查询出来了。

总结

在 Elasticsearch 中,"nested" 类型是一种特殊的数据类型,用于处理嵌套文档(nested documents)。
 
对于 "nested" 类型的字段,它包含的子字段(metadata)在查询时需要使用特定的嵌套查询来进行搜索操作,简单的查询无法直接搜索到嵌套字段的内容。
以我提供的数据映射为例,数据中的 "data" map 中的每个字段(如 "daterange102110"、 "input18779" 等)都无法直接进行搜索,因为 Elasticsearch 默认不会对嵌套字段进行索引。
 
如果你希望能够对嵌套字段进行搜索,你需要使用嵌套查询。例如,可以使用 Nested Query 结合 Match Query 或 Term Query 等查询类型来搜索嵌套字段。

es针对nested类型数据无法进行过滤查询的问题记录的更多相关文章

  1. ElasticSearch(ES)使用Nested结构存储KV及聚合查询

    自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客同步发表文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://w ...

  2. Java API 实现HBase的数据添加与过滤查询

    包依赖比较麻烦,找了好久,我用的CDH5.0 现将所依赖的包的列表清单如下: public class EmployeeDao { /** * @param args */ public static ...

  3. sql datetime类型数据如果进行模糊查询

    select * from Table1 where CONVERT(nvarchar(50),CreateTime,120) like '%2019'

  4. 干货 | Elasticsearch Nested类型深入详解(转)

    https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...

  5. 干货 | Elasticsearch Nested类型深入详解

    在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档. 父子文档的实现,至少包含以下两种方式: 1)父子文档 父子文档在5.X版本中通过parent- ...

  6. Elastic search中使用nested类型的内嵌对象

    在大数据的应用环境中,往往使用反范式设计来提高读写性能. 假设我们有个类似简书的系统,系统里有文章,用户也可以对文章进行赞赏.在关系型数据库中,如果按照数据库范式设计,需要两张表:一张文章表和一张赞赏 ...

  7. C# 任意类型数据转JSON格式(转)

    HOT SUMMER 每天都是不一样,积极的去感受生活 C# 任意类型数据转JSON格式 /// <summary> /// List转成json /// </summary> ...

  8. 自定义JsonResult处理JSON序列化DateTime类型数据(Ext4.2+ASP.NET MVC 4)

    最近项目中前台页面使用Extjs4.2 ,在后台ASP.NET MVC4返回的DateTime类型的数据错返回的DateTime类型的JsonResult的结果中的值是“\/Date(13784461 ...

  9. 针对各主流数据mysql、sqlserver、oracle中文乱码问题。

    针对各主流数据mysql.sqlserver.oracle当以编码格式gbk存放数据时,要注意字符串类型的字段,要采用宽字符串nvarchar存放,前提是当你的应用程序是utf8编码,而数据库是gbk ...

  10. SQL语句检索数据排序及过滤

    阅读目录 一:排序检索数据 二:过滤数据 三:高级数据过滤 四:用通配符进行过滤 回到顶部 一:排序检索数据 1.1 排序数据 比如查询数据库中表数据的时候,我们使用如下语句: select * fr ...

随机推荐

  1. 【原创】C++中vector的remove()函数

    话不多说,直接来 remove()干了什么: 把要删除元素后面的值移动到前面,返回最后一个被改变值的下一个迭代器. 举栗: // 首先,定义一个vector vector<int> dem ...

  2. JavaCV人脸识别三部曲之二:训练

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV人脸识别三部曲&g ...

  3. APP中Web容器的核心实现

      现在的业务型APP中,采用纯原生开发策略的已经很少了,大部分都使用的混合开发.如原生,H5,ReactNative,Flutter,Weex它们之间任意的组合就构成了混合开发. 其中原生+H5是出 ...

  4. 一个跨平台的`ChatGPT`悬浮窗工具

    一个跨平台的ChatGPT悬浮窗工具 使用avalonia实现的ChatGPT的工具,设计成悬浮窗,并且支持插件. 如何实现悬浮窗? 在使用avalonia实现悬浮窗也是非常的简单的. 实现我们需要将 ...

  5. 技术选型|K歌App中的实时合唱如何进行选型

    摘要 在线K歌软件的开发有许多技术难点,需考虑到音频录制和处理.实时音频传输和同步.音频压缩和解压缩.设备兼容性问题等技术难点外,此外,开发者还应关注音乐版权问题,确保开发的应用合规合法. 前言 前面 ...

  6. 软件设计 day1

    Software Design Methodology 软件设计方法学 中国石油大学(华东)2022-2023-3 国际周课程 Advanced software design 张晓东老师邀请在日本广 ...

  7. Asp-Net-Core学习笔记:gRPC快速入门

    前言 此前,我在做跨语言调用时,用的是 Facebook 的 Thrift,挺轻量的,还不错. Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务.它被当作一个远程过程调用 ...

  8. 【Kubernetes】yaml文件编写 -- 持续更新

    K8S通过yaml格式的声明式API与资源对象交互 API版本由apiVersion字段指定,API对象类型由kind字段指定 除此之外,每个API对象有三大类属性: metadata:元数据 spe ...

  9. Redis的设计与实现(6)-压缩列表

    压缩列表 (ziplist) 是列表键和哈希键的底层实现之一. 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做列 ...

  10. 解决Oracle jdbc驱动包maven下载失败问题

    由于Oracle版权限制,其jdbc驱动包不让人随便下载,这就给maven的下载和编译带来了麻烦. 解决办法是先获取jar包(方法一:去oracle官网下载,方法二:去oracle安装目录如produ ...