这可能是因为您的数据被分片到多个节点(多节点集群设置)而没有replicas,并且可能在您执行搜索查询时其中一个节点已关闭。
例如,
如果我有一个只有一个节点的集群,并且该节点有 1 个index 和4 documents,当我检查indices 时,我将得到以下输出,
health status index pri rep docs.count docs.deleted store.size pri.store.size
yellow open blog 5 1 4 0 10.9kb 10.9kb
现在,如果我运行 match_all 查询,
{
"query": {
"match_all": {}
}
}
我会得到的,
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 1,
"hits": [........
注意docs.count 等于hits 计数。在上面的输出中,观察分片的数量,它们是5。所有这些分片都分配给一个节点。
但如果我有一个多节点设置并配置了replicas not,那么这些分片将分布在多个节点中。
假设我有一个具有 Node 1 和 Node 2 的两个节点集群,总共有 5 个分片,在这 5 个分片中 shard 0, 1 , 3 被分配给 节点 2 并且该节点因维护而停机或因任何原因不可用。在这种情况下,您只有通过 节点 1 可用的分片 2 和 4。现在,如果您尝试检索或搜索数据,会发生什么? Elasticsearch 将为您提供来自幸存节点的搜索结果,即 Node 1。
这种情况下的命中数将始终小于docs.count 值。
使用replicas
可以避免这种不确定性