ElasticSearch聚合显示不正确的总数

hgtggwj0  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(2)|浏览(238)

ElasticSearch版本为7.4.2
我在Elasticsearch上很烂,我想弄清楚这个查询有什么问题。

{
  "size": 10,
  "from": 0,
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "firstName"
          }
        },
        {
          "query_string": {
            "query": "*",
            "fields": [
              "params.display",
              "params.description",
              "params.name",
              "lastName"
            ]
          }
        },
        {
          "match": {
            "status": "DONE"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "success": true
          }
        }
      ]
    }
  },
  "sort": {
    "createDate": "desc"
  },
  "collapse": {
    "field": "lastName.keyword",
    "inner_hits": {
      "name": "lastChange",
      "size": 1,
      "sort": [
        {
          "createDate": "desc"
        }
      ]
    }
  },
  "aggs": {
    "total": {
      "cardinality": {
        "field": "lastName.keyword"
      }
    }
  }
}

它会传回:

"aggregations": {
        "total": {
            "value": 429896
        }
    }

因此,大约有430k个结果,但是在分页时,我们在426k标记附近停止得到结果。

{
  "size": 10,
  "from": 427000,
...
}

我得到:

{
    "took": 2215,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 10000,
            "relation": "gte"
        },
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "total": {
            "value": 429896
        }
    }
}

但是如果我把from改为426000,我仍然得到结果。

unguejic

unguejic1#

您将字段lastName.keyword的基数聚合值与索引中的文档总数进行比较,这是两件不同的事情。
您可以使用在查询级别定义的count API和from/size来检查索引中的文档总数,即它会带来与您的搜索查询匹配的文档,由于您没有track_total_hits,它会显示10k,关系为gte表示有超过10k的文档与您的搜索查询匹配。
当涉及到您的聚合时,我可以看到在这两种情况下,它都返回计数429896,因为此聚合不依赖于您在查询中提到的from/size。

vmpqdwk3

vmpqdwk32#

当我发现基数参数具有精度控制时,我感到很惊讶。
设置最大值是我的解决方案。

相关问题