Elastic: 同一条索引,使用GET _cat/indices?v与GET index/_count查询出来的文档数为什么不
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结构是一致的
- 点赞
- 收藏
- 关注作者
评论(0)