愚者求师之过,智者从师之长。
nested

nested

请教一个计算平均差值的问题

ElasticsearchGod_lockin 回复了问题 • 3 人关注 • 3 个回复 • 3569 次浏览 • 2024-01-02 10:13 • 来自相关话题

es局部更新文档字段

Elasticsearchduanxiaobiao 回复了问题 • 2 人关注 • 1 个回复 • 5518 次浏览 • 2023-04-02 15:39 • 来自相关话题

求助:nestde嵌套实现类似not exist的效果

ElasticsearchFFFrp 回复了问题 • 2 人关注 • 1 个回复 • 5258 次浏览 • 2023-02-02 10:42 • 来自相关话题

多层nested的多条件查询

Elasticsearchduanxiaobiao 回复了问题 • 2 人关注 • 1 个回复 • 1710 次浏览 • 2022-05-17 23:19 • 来自相关话题

6.X版本中java实体FieldType.Nested映射不生效的问题

Elasticsearchnofearinmyheat 回复了问题 • 2 人关注 • 1 个回复 • 3482 次浏览 • 2021-11-13 11:42 • 来自相关话题

求助,搜索时由于逆文档频率,匹配到更多分词的文档没有被放在最前面

ElasticsearchCurryQin 回复了问题 • 2 人关注 • 1 个回复 • 1552 次浏览 • 2021-08-09 17:18 • 来自相关话题

nested 嵌套文档 汇总过滤

回复

默认分类ming_lei 发起了问题 • 2 人关注 • 0 个回复 • 2014 次浏览 • 2021-05-26 11:50 • 来自相关话题

nested查询只取内部的第一条或者指定的条数

Elasticsearchwangwei2021 回复了问题 • 4 人关注 • 3 个回复 • 4121 次浏览 • 2021-04-17 16:20 • 来自相关话题

elasticsearch nested 是怎么查询 符合条件的的子文档数 最少x个的需求的

Elasticsearchpony_maggie 回复了问题 • 2 人关注 • 1 个回复 • 2734 次浏览 • 2020-09-03 09:24 • 来自相关话题

一种处理Elasticsearch对象数组类型的方式

Elasticsearchtrycatchfinal 发表了文章 • 0 个评论 • 7273 次浏览 • 2020-03-10 20:27 • 来自相关话题

目前情况

Elasticsearch中处理对象数组有两种格式array和nested,但这两种都有一定的不足。
以下面的文档为例:

{
  "user": [
    {
      "first": "John",
      "last": "Smith"
    },
    {
      "first": "Alice",
      "last": "White"
    }
  ]
}

如果在mapping中以array存储,那么实际存储为:

user.first:["John","Alice"]
user.last:["Smith","White"]

如果以must的方式查询user.first:Johnuser.last:White,那么这篇文档也会命中,这不是我们期望的。

如果在mapping中以array存储,Elasticsearch将每个对象视为一个doc,这例子会存储3个doc,会严重影响ES写入和查询的效率。

Flatten格式

我想到的存储方式很简单,就是将对象数组打平保存为一个keyword类型的字符串数组,故起名Flatten格式。 以上面文档为例,数组对象需要转换为下面的格式

"user.flatten": [
    "first:John",
    "last:Smith",
    "first:John&last:Smith",
    "first:Alice",
    "last:White",
    "first:Alice&last:White"
  ]

这样以must的方式查询user.first:Johnuser.last:White,可以转换为term查询first:John&last:White,并不会命中文档。
同时,这种方式还是保存1个doc,避免了nested的缺点。

对于flatten格式有几点说明

user.flatten数组的大小

如果user对象个数为M,user属性个数为N,那么其数组大小为(2^N-1)*M

对象为空怎么处理

建议以null方式保存,例如:

    {
              "first": "John",
             "last": null
    }

转换后的格式

    [
        "first:John",
        "last:null",
        "first:John&last:null",
    ]

保存和查询对于对象属性的处理顺序要保持一致

上述例子都是按first&last顺序存储的,那么以must的方式查询user.first:Johnuser.last:White也要以first:John&last:White方式查询,不能用last:White&first:John

不足

  • 需要自己编码将JSON对象转换为字符串数组
  • 需要自己编码转换查询语句
  • 只支持term查询

elasticsearch-rest-client 能使用nested吗?

ElasticsearchGod_lockin 回复了问题 • 4 人关注 • 3 个回复 • 1893 次浏览 • 2019-12-23 18:28 • 来自相关话题

请问NESTED查询,如何实现not exists逻辑

回复

Elasticsearchenvy666 回复了问题 • 1 人关注 • 1 个回复 • 3245 次浏览 • 2019-10-08 15:14 • 来自相关话题

Elasticsearch Nested根据满足条数计算子项的分

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 1 个回复 • 3774 次浏览 • 2019-04-25 21:10 • 来自相关话题

对nested类型字段进行查询和聚合

回复

Elasticsearchcl1321 回复了问题 • 3 人关注 • 1 个回复 • 8708 次浏览 • 2019-03-06 11:46 • 来自相关话题

Nested嵌套的index 怎么导数据?

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 1 个回复 • 2112 次浏览 • 2018-11-19 20:48 • 来自相关话题

请教一个计算平均差值的问题

回复

ElasticsearchGod_lockin 回复了问题 • 3 人关注 • 3 个回复 • 3569 次浏览 • 2024-01-02 10:13 • 来自相关话题

es局部更新文档字段

回复

Elasticsearchduanxiaobiao 回复了问题 • 2 人关注 • 1 个回复 • 5518 次浏览 • 2023-04-02 15:39 • 来自相关话题

求助:nestde嵌套实现类似not exist的效果

回复

ElasticsearchFFFrp 回复了问题 • 2 人关注 • 1 个回复 • 5258 次浏览 • 2023-02-02 10:42 • 来自相关话题

多层nested的多条件查询

回复

Elasticsearchduanxiaobiao 回复了问题 • 2 人关注 • 1 个回复 • 1710 次浏览 • 2022-05-17 23:19 • 来自相关话题

6.X版本中java实体FieldType.Nested映射不生效的问题

回复

Elasticsearchnofearinmyheat 回复了问题 • 2 人关注 • 1 个回复 • 3482 次浏览 • 2021-11-13 11:42 • 来自相关话题

求助,搜索时由于逆文档频率,匹配到更多分词的文档没有被放在最前面

回复

ElasticsearchCurryQin 回复了问题 • 2 人关注 • 1 个回复 • 1552 次浏览 • 2021-08-09 17:18 • 来自相关话题

nested 嵌套文档 汇总过滤

回复

默认分类ming_lei 发起了问题 • 2 人关注 • 0 个回复 • 2014 次浏览 • 2021-05-26 11:50 • 来自相关话题

nested查询只取内部的第一条或者指定的条数

回复

Elasticsearchwangwei2021 回复了问题 • 4 人关注 • 3 个回复 • 4121 次浏览 • 2021-04-17 16:20 • 来自相关话题

elasticsearch nested 是怎么查询 符合条件的的子文档数 最少x个的需求的

回复

Elasticsearchpony_maggie 回复了问题 • 2 人关注 • 1 个回复 • 2734 次浏览 • 2020-09-03 09:24 • 来自相关话题

elasticsearch-rest-client 能使用nested吗?

回复

ElasticsearchGod_lockin 回复了问题 • 4 人关注 • 3 个回复 • 1893 次浏览 • 2019-12-23 18:28 • 来自相关话题

请问NESTED查询,如何实现not exists逻辑

回复

Elasticsearchenvy666 回复了问题 • 1 人关注 • 1 个回复 • 3245 次浏览 • 2019-10-08 15:14 • 来自相关话题

Elasticsearch Nested根据满足条数计算子项的分

回复

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 1 个回复 • 3774 次浏览 • 2019-04-25 21:10 • 来自相关话题

对nested类型字段进行查询和聚合

回复

Elasticsearchcl1321 回复了问题 • 3 人关注 • 1 个回复 • 8708 次浏览 • 2019-03-06 11:46 • 来自相关话题

Nested嵌套的index 怎么导数据?

回复

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 1 个回复 • 2112 次浏览 • 2018-11-19 20:48 • 来自相关话题

nested字段聚合的一个问题

回复

ElasticsearchLovelyFeng 回复了问题 • 4 人关注 • 4 个回复 • 5575 次浏览 • 2018-11-01 17:17 • 来自相关话题

一种处理Elasticsearch对象数组类型的方式

Elasticsearchtrycatchfinal 发表了文章 • 0 个评论 • 7273 次浏览 • 2020-03-10 20:27 • 来自相关话题

目前情况

Elasticsearch中处理对象数组有两种格式array和nested,但这两种都有一定的不足。
以下面的文档为例:

{
  "user": [
    {
      "first": "John",
      "last": "Smith"
    },
    {
      "first": "Alice",
      "last": "White"
    }
  ]
}

如果在mapping中以array存储,那么实际存储为:

user.first:["John","Alice"]
user.last:["Smith","White"]

如果以must的方式查询user.first:Johnuser.last:White,那么这篇文档也会命中,这不是我们期望的。

如果在mapping中以array存储,Elasticsearch将每个对象视为一个doc,这例子会存储3个doc,会严重影响ES写入和查询的效率。

Flatten格式

我想到的存储方式很简单,就是将对象数组打平保存为一个keyword类型的字符串数组,故起名Flatten格式。 以上面文档为例,数组对象需要转换为下面的格式

"user.flatten": [
    "first:John",
    "last:Smith",
    "first:John&last:Smith",
    "first:Alice",
    "last:White",
    "first:Alice&last:White"
  ]

这样以must的方式查询user.first:Johnuser.last:White,可以转换为term查询first:John&last:White,并不会命中文档。
同时,这种方式还是保存1个doc,避免了nested的缺点。

对于flatten格式有几点说明

user.flatten数组的大小

如果user对象个数为M,user属性个数为N,那么其数组大小为(2^N-1)*M

对象为空怎么处理

建议以null方式保存,例如:

    {
              "first": "John",
             "last": null
    }

转换后的格式

    [
        "first:John",
        "last:null",
        "first:John&last:null",
    ]

保存和查询对于对象属性的处理顺序要保持一致

上述例子都是按first&last顺序存储的,那么以must的方式查询user.first:Johnuser.last:White也要以first:John&last:White方式查询,不能用last:White&first:John

不足

  • 需要自己编码将JSON对象转换为字符串数组
  • 需要自己编码转换查询语句
  • 只支持term查询