Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

es 获取总数的几种方式

Elasticsearch 笔记 Elasticsearch 笔记


elasticsearch(es)获取匹配文档的总条数的接口是什么?各种方式如何使用?

推荐答案

针对获取匹配文档的总数需求,es 对此提供了单独的 count 接口。

{index}/_count

kibana 的示例

假设针对 qa 索引,针对 question 和 answer 字段匹配 elasticsearh 的文档总数显示,kibana dev tools 中的代码如下:

GET qa/_count
{
  "query": {
    "multi_match": {
      "query": "elasticsearch",
      "fields": ["question","answer"]
    }
  }
}

返回结果可能如下:

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

curl 命令快速查看

curl 命令支持 http 协议,通过 elasticsearch 的 http restful 接口访问代码示例如下:

curl -X GET -H "Content-Type:application/json" -d '{"query":{"multi_match":{"query":"elasticsearch","fields":["question","answer"]}}}' http://{es_url}:{es_url,eg:9200}/qa/_count

java ElasticsearchTemplate _count

如果项目中,使用 java spring-data-elasticsearch 的 ElasticsearchTemplate 操作 es,可以进行如下操作:

String[] count_match_field = new String[]{"question", "answer"};

MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders
        .multiMatchQuery(keyword, count_match_field)
        .minimumShouldMatch("100%");

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withIndices(INDEX)
        .withQuery(multiMatchQueryBuilder)
        .build();

try {
    long count = elasticsearchTemplate.count(searchQuery);
    searchContext.getCommonSearchResultDTOWrapper().setTotal((int) count);
} catch (Throwable throwable) {
    log.error("qa count es error", throwable);
}