首页 > 其他分享 >ElasticSearch 备考 -- Nested

ElasticSearch 备考 -- Nested

时间:2024-09-03 21:53:03浏览次数:10  
标签:features -- phones value Nested 嵌套 ElasticSearch nested type

一、题目

存在索引phones,其中存在两条数据如下

PUT phones/_doc/1

{
    "brand": "Samsumg",
    "model": "Galaxy S9+",
    "features": [
        {
            "type": "os",
            "value": "Android"
        },
        {
            "type": "storage",
            "value": "64"
        },
        {
            "type": "camera_resolution",
            "value": "12"
        }
    ]
}

PUT phones/_doc/2

{
    "brand": "Apple",
    "model": "iPhone XR",
    "features": [
        {
            "type": "os",
            "value": "Apple 10s"
        },
        {
            "type": "storage",
            "value": "128"
        },
        {
            "type": "camera_resolution",
            "value": "12"
        }
    ]
}

写入数据后使用如下查询语句查询,但是不符合预期,在索引中其实并不存在storage为12的数据

GET /phones/_search

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "features.type": "storage"
                    }
                },
                {
                    "match": {
                        "features.value": "12"
                    }
                }
            ]
        }
    }
}

重新定义个索引phones_new 写入数据,保持原features下type和value结构,预期使用查询语句预期无数据可以满足。

二、思考

Elasticsearch 没有内部对象的概念。因此,它将对象层次结构扁平化为一个简单的字段名和值列表。引用官网示例解释例如下截图

如果想将通过嵌套对象方式存储,可以通过将数据设置为nested类型,它是object一种数据类型,允许对象数组以相互独立的方式进行索引。

三、解题

Step 1、使用nesed创建新mapping

PUT phones_new
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "brand": {
        "type": "text"
      },
      "model": {
        "type": "text"
      },
      "features": {
        "type": "nested",
        "properties": {
          "fields": {
            "type": "keyword"
          },
          "value": {
            "type": "text"
          }
        }
      }
    }
  }
}

Step 2、修改原查询为nested

POST phones_new/_search
{
  "query": {
    "nested": {
      "path": "features",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "features.type": "storage"
              }
            },
            {
              "match": {
                "features.value": 12
              }
            }
          ]
        }
      }
    }
  }
}

四、总结

1、Elasticsearch 没有内部对象的概念。因此,它将对象层次结构扁平化为一个简单的字段名和值列表。可以通过设置为nested类型,是object一种数据类型,允许对象数组以相互独立的方式进行索引。

2、嵌套文档是指对于一行数据(文档)可以包含多个子行(子文档),多个子行保存在一个嵌套类型字段中。

3、嵌套类型的查询与query存在区别需要指定path。此外嵌套类型的查询性能相比其他类型的查询性能更低一些。

4、nested类型的对象默认不能超过50个,可通过index.mapping.nested_fields.limit修改。

5、一个文档中,nested类型中包含的嵌套对象的数量默认不能超过10000个,可通过index.mapping.nested_objects.limit修改。

参考资料

送一波福利:

标签:features,--,phones,value,Nested,嵌套,ElasticSearch,nested,type
From: https://blog.csdn.net/hengzhepa/article/details/141817012

相关文章

  • 深入浅出Stream流
    Java8的新特性之一就是流stream,配合同版本出现的Lambda,使得操作集合(Collection)提供了极大的便利。案例引入在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。假设遇到了这么一个需求:从给定句......
  • Hadoop 第八周总结
    Hadoop第八周总结在第八周的学习中,我进一步探索了Hadoop生态系统的高级功能和工具,主要集中在Hadoop的优化技巧、数据处理框架的整合以及大数据应用的实际案例。以下是本周学习的主要内容和总结:1.Hadoop的性能优化在处理大规模数据时,性能优化至关重要。本周我深......
  • 深入理解Android Activity的四种LaunchMode
            在Android开发中,Activity的启动模式(LaunchMode)是控制Activity实例创建、复用及在任务(Task)中排列方式的重要机制。理解并掌握这些模式对于构建高效、流畅的用户体验至关重要。本文将详细探讨standard、singleTop、singleTask和singleInstance这四种启动模式,并通......
  • Python参数传递的艺术:解锁编程灵活性的秘密武器
    引言参数传递作为函数调用过程中的关键环节,对程序逻辑有着重要影响。不同的参数传递方式能够帮助我们更好地组织代码,提高程序运行效率。比如,在处理大量数据或复杂业务逻辑时,合理的参数设计可以让我们的代码更简洁、更高效;而在进行单元测试或者接口调试时,灵活的参数机制又能极大地......
  • malloc/free 和 new/delete的区别
    malloc/free和new/delete是C++中两种不同的动态内存管理方法,它们有一些关键的区别:1.内存分配和释放机制malloc和free:函数:malloc是一个C标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个void*指针,指向分配的内存块的起始位置。free用于释放由......
  • 记一次我的博客园页面突然无法显示markdown数学公式
    之前都还好好的,今天突然给我数学公式卡没了......具体情况如下但是我编辑的时候预览明明可以摘要里显示也没有问题给官方写了封邮件后得到回复如下您好,我们这边测试一下在没有自定义内容的情况下数学公式是正常加载的,建议您排查自定义样式是否与数学公式渲染发生了冲突。......
  • 函数的力量:掌握Python中的“返回值”艺术
    引言在实际开发过程中,函数的返回值扮演着极其重要的角色。它不仅能够简化代码结构,提高代码复用性,还能帮助我们构建更加灵活高效的程序架构。通过合理设计函数的返回值,可以轻松实现数据处理、状态传递等多种功能。接下来,让我们一起深入了解如何定义与使用Python函数中的返回值。基......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能分......
  • RRAM流片调试心得
    RRAM流片调试心得去年进行了一次RRAM的流片工作,也是人生第一次流片,一些工作细节不便涉及,但是可以谈谈这次流片以及后续测试中碰到的问题,以便后续查阅。芯片于UMC完成180nm的CMOS前道工艺,共生长5层金属(到V5),随后出Fab,送到所里生长RRAM和M6完成后道工艺,版图需要遵守工艺需求,另外需......
  • OpenCV与AI深度学习 | 实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + 代码
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|OpenCV传统方法实现密集圆形分割与计数(详细步骤+代码)导 读    本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍  实例图片来......