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);
}