在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会将field01的type映射成object类型,这个时候,我们去查询可能就会出现问题。需要手动修改成nested嵌套类。型。

一、有问题的情形演示。

1、插入数据,es默认会自动创建映射

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
  2. {
  3. "name" : "my name is zhangsa",
  4. "address" : [
  5. {
  6. "city" : "china hubei",
  7. "zipcode" : "123456"
  8. },
  9. {
  10. "city" : "china huanggang",
  11. "zipcode" : "654321"
  12. }
  13. ]
  14. }'

2、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,这个时候应该查询不出来数据,可是查询的结果如下。
    注意这样可以查询出来是因为底层的存储格式被扁平化成下方这种格式了

               address.city=["china", "hubei","huanggang"]

               address.zipcode=["123456","64321"]

               那么city和zipcode之间的关联关系就打乱了。


 二、正确的做法

1、创建索引的时候,手动指定address的type为nested

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex" -d'
  2. {
  3. "mappings": {
  4. "personinfo" : {
  5. "properties": {
  6. "name" : {
  7. "type": "text"
  8. },
  9. "address" : {
  10. "type": "nested",
  11. "properties": {
  12. "city" : {
  13. "type" : "text"
  14. },
  15. "zipcode" : { "type" : "keyword" }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }'

2、插入数据

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
  2. {
  3. "name" : "my name is zhangsa",
  4. "address" : [
  5. {
  6. "city" : "china hubei",
  7. "zipcode" : "123456"
  8. },
  9. {
  10. "city" : "china huanggang",
  11. "zipcode" : "654321"
  12. }
  13. ]
  14. }'

3、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,应该查询不出来结果,就是正确的。
    注意嵌套对象会被索引成分离的隐藏文档,不能直接查询它们。而是需要使用nested查询或nested过滤器来查询它们。

elasticsearch嵌套对象的映射的更多相关文章

  1. elasticsearch 嵌套对象之嵌套类型

    nested类型是一种特殊的对象object数据类型(specialised version of the object datatype ),允许对象数组彼此独立地进行索引和查询. 1. 对象数组如 ...

  2. elasticsearch 嵌套对象使用Multi Match Query、query_string全文检索设置

    参考: https://www.elastic.co/guide/en/elasticsearch/reference/1.7/mapping-nested-type.html https://sta ...

  3. AutoMapper 创建嵌套对象映射(原创)

    之前在做DTO转换时,用到AutoMapper.但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下: 思路:采用递归和反射很好的避免手工创建嵌套对象的映射. 第一个版本, ...

  4. ElasticSearch 嵌套映射和过滤器及查询

    ElasticSearch - 嵌套映射和过滤器 Because nested objects are indexed as separate hidden documents, we can’t q ...

  5. Elasticsearch创建索引和映射结构详解

    前言 这篇文章详细介绍了如何创建索引和某个类型的映射. 下文中[address]指代elasticsearch服务器访问地址(http://localhost:9200). 1       创建索引 ...

  6. Grails 对象关联映射 (GORM) 一

    转自:http://justjavac.iteye.com/blog/701445 Domain 类是任何商业应用的核心. 他们保存事务处理的状态,也处理预期的行为. 他们通过关联联系在一起, one ...

  7. 做一次面向对象的体操:将JSON字符串转换为嵌套对象的一种方法

    背景与问题 在 <一个略复杂的数据映射聚合例子及代码重构> 一文中,将一个JSON字符串转成了所需要的订单信息Map.尽管做了代码重构和配置化,过程式的代码仍然显得晦涩难懂,并且客户端使用 ...

  8. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  9. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

随机推荐

  1. container of()函数简介

    在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义 ...

  2. Vue跨域问题解决

    项目根目录下创建vue.config.js module.exports = { devServer: { proxy: { //配置跨域 '/api': { //这里是真实的后台接口 target: ...

  3. 前端框架VUE——数据绑定及模板语法

    一.数据绑定 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ msg }} </di ...

  4. Nginx:进程调度

    Blog:博客园 个人 Nginx采用的是固定数量的多进程模型,由一个主进程(MasterProcess)和数量与主机CPU核数相同的工作进程协同处理各种事件. 主管理进程负责工作进程的配置加载.启停 ...

  5. 数据结构与算法——平衡二叉树(AVL树)

    目录 二叉排序树存在的问题 基本介绍 单旋转(左旋转) 树高度计算 旋转 右旋转 双旋转 完整代码 二叉排序树存在的问题 一个数列 {1,2,3,4,5,6},创建一颗二叉排序树(BST) 创建完成的 ...

  6. 洛谷P1803——凌乱的yyy(贪心)

    题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...

  7. vue报错 Uncaught TypeError: Cannot read property of null

    有可能是点击a标签,但是a标签有click事件,未阻止默认事件导致报错,开始都看不出来是什么错误

  8. css3 animate转圈360旋转

    .logo{ width:20px; height: 20px; background: red; -webkit-animation:haha1 .8s linear infinite; anima ...

  9. 深度理解JVM

      1. 环境搭建 安装jdk 2. 内存溢出场景模拟 public class Test01 { public static void main(String[] args) { //测试内存溢出 ...

  10. IDEA连接Mysql数据库之后,在Mapper.xml编写SQL时不会自动提示表信息问题(非常详细!)

    1.首先得连接上数据库 (一)点击IDEA右侧数据库模块 (二)选择MySql进行连接 (三)填写数据库相关配置 (四)重点!!! 这个时候点击测试连接是连接不上的,需要设置时区 (按照如下设置) ( ...