【Elasticsearch】ES正确查询文档数不要使用_search的hit而是使用_count

举报
小雨青年 发表于 2022/03/28 22:36:36 2022/03/28
【摘要】 hit 使用hit作为查询的计数是错误的。 当我们执行一个查询,比如下面的查询 GET /my-index-000001/_search { "query": { "term": { ...

hit

使用hit作为查询的计数是错误的。

当我们执行一个查询,比如下面的查询

GET /my-index-000001/_search
{
  "query": {
    "term": {
      "user.id": "kimchy"
    }
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可能得到以下结果

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.3862942,
    "hits": [
      {
        "_index": "my-index-000001",
        "_type" : "_doc",
        "_id": "0",
        "_score": 1.3862942,
        "_source": {
          "@timestamp": "2099-11-15T14:12:12",
          "http": {
            "request": {
              "method": "get"
            },
            "response": {
              "status_code": 200,
              "bytes": 1070000
            },
            "version": "1.1"
          },
          "source": {
            "ip": "127.0.0.1"
          },
          "message": "GET /search HTTP/1.1 200 1070000",
          "user": {
            "id": "kimchy"
          }
        }
      }
    ]
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

通过结果我们可以发现,如果按照hits->total->value,可以拿到结果是1的个数数据,如果我们没有仔细查看文档,那么就会以为这个就是结果的个数,实际上不是的。

By default, you cannot page through more than 10,000 hits using the from and size parameters. To page through more hits, use the search_after parameter.
默认情况下,使用from和size参数不能翻阅超过10,000个匹配。 要翻阅更多匹配,请使用search_after参数。

也就是说

  • _search的搜索分页最多只能到一万条数据,如果需要修改就要调整其他参数
  • hits最多返回10000

如果根据条件查询的数据总数是超过一万条,那么这个查询就是不对的了。

_count

使用_count可以查询条件对应数据的总数,并且不会出现hit的一万条限制。

GET /my-index-000001/_count
{
  "query" : {
    "term" : { "user.id" : "kimchy" }
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对应结果为

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参考资料

  • https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-search.html
  • https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-count.html

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/113875194

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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