Well,不要刷屏了
nested

nested

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

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

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

Elasticsearchtrycatchfinal 发表了文章 • 0 个评论 • 1719 次浏览 • 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 个回复 • 353 次浏览 • 2019-12-23 18:28 • 来自相关话题

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

回复

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

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

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

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

回复

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

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

Elasticsearchcl1321 回复了问题 • 3 人关注 • 1 个回复 • 1451 次浏览 • 2019-02-22 09:43 • 来自相关话题

Nested嵌套的index 怎么导数据?

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

nested字段聚合的一个问题

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

nested 类型查询 子文档怎么分支排序啊

Elasticsearchheeexy 回复了问题 • 2 人关注 • 1 个回复 • 1209 次浏览 • 2018-09-13 13:55 • 来自相关话题

请问:查找nested里的记录数大于100的脚本应该怎么写?如果改成child应该怎么写呢?

回复

Elasticsearchmyst 发起了问题 • 1 人关注 • 0 个回复 • 901 次浏览 • 2018-08-09 19:07 • 来自相关话题

nested 聚合怎么排序 报错non single-bucket aggregation

ElasticsearchLiuYang1 回复了问题 • 5 人关注 • 3 个回复 • 2920 次浏览 • 2018-08-08 17:36 • 来自相关话题

能否对 nested 类型 分页取出?

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 1427 次浏览 • 2018-06-26 22:34 • 来自相关话题

nested查询,内部需要聚合,再刷选,怎么弄?

Elasticsearchmafa1993 回复了问题 • 3 人关注 • 1 个回复 • 2099 次浏览 • 2018-05-14 11:56 • 来自相关话题

nested 数组嵌套对象查询

Elasticsearchcaster 回复了问题 • 3 人关注 • 1 个回复 • 4562 次浏览 • 2017-09-13 14:57 • 来自相关话题

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

回复

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

elasticsearch-rest-client 能使用nested吗?

回复

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

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

回复

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

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

回复

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

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

回复

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

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

回复

Elasticsearchcl1321 回复了问题 • 3 人关注 • 1 个回复 • 1451 次浏览 • 2019-02-22 09:43 • 来自相关话题

Nested嵌套的index 怎么导数据?

回复

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

nested字段聚合的一个问题

回复

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

nested 类型查询 子文档怎么分支排序啊

回复

Elasticsearchheeexy 回复了问题 • 2 人关注 • 1 个回复 • 1209 次浏览 • 2018-09-13 13:55 • 来自相关话题

请问:查找nested里的记录数大于100的脚本应该怎么写?如果改成child应该怎么写呢?

回复

Elasticsearchmyst 发起了问题 • 1 人关注 • 0 个回复 • 901 次浏览 • 2018-08-09 19:07 • 来自相关话题

nested 聚合怎么排序 报错non single-bucket aggregation

回复

ElasticsearchLiuYang1 回复了问题 • 5 人关注 • 3 个回复 • 2920 次浏览 • 2018-08-08 17:36 • 来自相关话题

能否对 nested 类型 分页取出?

回复

Elasticsearchlaoyang360 回复了问题 • 3 人关注 • 2 个回复 • 1427 次浏览 • 2018-06-26 22:34 • 来自相关话题

nested查询,内部需要聚合,再刷选,怎么弄?

回复

Elasticsearchmafa1993 回复了问题 • 3 人关注 • 1 个回复 • 2099 次浏览 • 2018-05-14 11:56 • 来自相关话题

nested 数组嵌套对象查询

回复

Elasticsearchcaster 回复了问题 • 3 人关注 • 1 个回复 • 4562 次浏览 • 2017-09-13 14:57 • 来自相关话题

关于Elasticsearch的嵌套查询问题,为何返回的子集中含有不符合过滤条件的?

回复

Elasticsearchliushui00001 回复了问题 • 8 人关注 • 4 个回复 • 5535 次浏览 • 2017-05-04 16:46 • 来自相关话题

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

Elasticsearchtrycatchfinal 发表了文章 • 0 个评论 • 1719 次浏览 • 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查询