Elastic: 同一条索引,使用GET _cat/indices?v与GET index/_count查询出来的文档数为什么不

举报
wu@55555 发表于 2022/11/19 17:28:35 2022/11/19
【摘要】 1. 解析首先我们来看官方文档中对于_cat/indices的解释:原文:These metrics are retrieved directly from Lucene, which Elasticsearch uses internally to power indexing and search. As a result, all document counts include hi...

1. 解析

首先我们来看官方文档中对于_cat/indices的解释:
原文:
These metrics are retrieved directly from Lucene, which Elasticsearch uses internally to power indexing and search. As a result, all document counts include hidden nested documents.

译文:
这些指标是直接从Lucene中获取的,Elasticsearch内部使用Lucene来支持索引和搜索。因此,所有的文档计数都包括隐藏的嵌套文档

其实看到官方文档的解释答案已经明了了,我们看到最后一句:使用_cat/indices的查询是会将doc中隐藏的嵌套文档给查出来,看到这里可能不太清楚Nested结构的同学会比较迷糊,简单来说呢,就是当我们使用nested数据类型的时候,除了本身的doc之外,是会创建一个嵌套子对象的doc的,有多少个对象就会创建多少个隐藏嵌套doc

下面我们举例说明

2. 案例

数据

PUT test_nested
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "nested"
      }
    }
  }
}

POST test_nested/_bulk
{"index":{}}
{"my_id":1,"tags":[{"name":"1","title":"1"},{"name":"1","title":"1"}]}
{"index":{}}
{"my_id":1,"tags":{"name":"1","title":"1"}}

_count查询

GET test_nested/_count

结果

{
  "count" : 2,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  }
}

_cat/indices查询

GET _cat/indices?v 

结果
在这里插入图片描述

2.1 解析

我们查看原数据,tags是nested类型的,doc1中tags为数组,下面有两个子对象,因此嵌套隐藏doc为2,doc2中tags下只有一个嵌套子对象{"name":"1","title":"1"},因此隐藏doc为1,加上本身的两个doc,总共的doc数为:2+2+1=5

因此_cat/indices查询的doc数就是5
而_count是不会查询隐藏doc的,所以数量为2

POST test_nested/_bulk
{"index":{}}
{"my_id":1,"tags":[{"name":"1","title":"1"},{"name":"1","title":"1"}]}
{"index":{}}
{"my_id":1,"tags":{"name":"1","title":"1"}}

3 拓展

我们知道join类型也是一对多的结构,但是我们测试可知,join类型并不会创建嵌套隐藏doc,也就是说join类型的GET _cat/indices?v与GET index/_count结构是一致的

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。