es 除了获取匹配的文档具体信息外,也可以只获取匹配的文档条数(count),对此 elasticsearch 提供了单独的 count 接口,count 查询 api 指定的操作以 _count
收尾。
_count 示例
下面通过 kibana 给出示例:
GET qa/_count
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["question","answer"]
}
}
}
返回数据结果如下:
{ "count": 327, "_shards": { "total": 8, "successful": 8, "skipped": 0, "failed": 0 } }
_count 语法
GET /<target>/_count
count API 支持多个 target(即多个索引同时查询),多个索引用逗号隔开,同时 count 接口也支持通配符(*
)。
查询参数(query parameters)
-
allow_no_indices
(可选项,Boolean)顾名思义当查询的索引中是否允许有不存在的索引,默认是
true
,如果设置为false
,则指定的索引中有不存在时,会报错。 -
analyzer
(可选项,string)指定查询字符串的分析器。
该参数只能在
q
指定查询字符串参数时使用。 -
analyze_wildcard
(可选项,Boolean)如果
true
,通配符和前缀查询会被分析。默认为false
。该参数只能在
q
指定查询字符串参数时使用。 -
default_operator
(可选项,string)查询字符串查询的默认运算符,可选
AND
和OR
,默认是OR
。该参数只能在
q
指定查询字符串参数时使用。 -
df
(可选项,string)默认使用的字段,其中查询字符串中没有给出字段前缀。
该参数只能在
q
指定查询字符串参数时使用。 -
expand_wildcards
(可选项,string)通配符模式可以匹配的索引类型。
可选项有:
-
all
匹配任何类型的索引,包括隐藏的。
-
open
(默认值)匹配开放的、非隐藏的索引。
-
closed
匹配封闭的、非隐藏的索引。
-
hidden
匹配隐藏索引。必须与
open
,closed
或两者一起结合使用。 -
none
不接受通配符模式。
-
-
ignore_throttled
(可选项,Boolean)如果
true
,表示忽略具体、扩展或别名索引。默认为true
。 -
ignore_unavailable
(可选项,Boolean)如果
false
,如果请求针对丢失或关闭的索引,则返回错误。默认为false
。 -
lenient
(可选项,Boolean)如果
true
,查询字符串中基于格式的查询失败(例如,向数字字段提供文本)将被忽略。默认为false
。该参数只能在
q
指定查询字符串参数时使用。 -
min_score
(可选项,float)设置值表示文档的
_score
分数必须在指定值之上,即设置结果中_score
的最小值。 -
preference
(可选项,string)指定应在其上执行操作的节点或分片。默认是随机。
-
q
(可选项,string)以 Lucene 查询字符串语法进行查询。
-
routing
(可选项,string)用于将操作路由到特定分片的自定义值。
-
terminate_after
(可选项,integer)为每个分片收集的最大文档数。如果查询达到此限制,Elasticsearch 会提前终止查询。Elasticsearch 在排序之前收集文档。
应谨慎使用该参数。Elasticsearch 将此参数应用于处理请求的每个分片。如果可能,让 Elasticsearch 自动执行提前终止。避免针对多个索引的查询指定该参数。
请求正文(request body)
-
query
(可选项,query 对象)使用查询 DSL 语句。
PUT /my-index-000001/_doc/1?refresh
{
"user.id": "kimchy"
}
GET /my-index-000001/_count?q=user:kimchy
GET /my-index-000001/_count
{
"query" : {
"term" : { "user.id" : "kimchy" }
}
}
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);
}