Я пытаюсь посчитать документы с уникальным значением вложенного поля (и далее, сами документы). Похоже, получение уникальных документов работает. Но когда я пытаюсь выполнить запрос для count
, я получаю сообщение об ошибке:
Подавлено: org.elasticsearch.client.ResponseException: метод [POST], host [ http://localhost: 9200] , URI [/ package / _count? Ignore_throttled = true & ignore_unavailable = false & expand_wildcards = open & allow_no_indices = true], строка состояния [HTTP / 1.1 400 Bad Request] {"error": {"root_cause" : [{"type": "parsing_exception", "reason": "запрос не поддерживает [collapse]", "line": 1, "col": 216}], "type": "parsing_exception", "reason" : "запрос не поддерживает [свернуть]", "строка": 1, "столбец": 216}, "статус": 400}
Код:
BoolQueryBuilder innerTemplNestedBuilder = QueryBuilders.boolQuery();
NestedQueryBuilder templatesNestedQuery = QueryBuilders.nestedQuery("attachment", innerTemplNestedBuilder, ScoreMode.None);
BoolQueryBuilder mainQueryBuilder = QueryBuilders.boolQuery().must(templatesNestedQuery);
if (!isEmpty(templateName)) {
innerTemplNestedBuilder.filter(QueryBuilders.termQuery("attachment.name", templateName));
}
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource()
.collapse(new CollapseBuilder("attachment.uuid"))
.query(mainQueryBuilder);
// NEXT LINE CAUSE ERROR
long count = client.count(new CountRequest("package").source(searchSourceBuilder), RequestOptions.DEFAULT).getCount(); <<<<<<<<<< ERROR HERE
// THIS WORKS
SearchResponse searchResponse = client.search(
new SearchRequest(
new String[] {"package"},
searchSourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)).from(offset).size(limit)
).indices("package").searchType(SearchType.DFS_QUERY_THEN_FETCH),
RequestOptions.DEFAULT
);
return ....;
Общее намерение подхода состоит в том, чтобы получить часть документов и количество всех таких документов. Может быть, есть другой подход для этой необходимости уже существует. Если я пытаюсь получить count
, используя aggregations
и cardinality
- я получаю нулевой результат, и похоже, что он не работает на вложенных полях.
Запрос на подсчет:
{
"query": {
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"adjust_pure_negative": true,
"boost": 1.0
}
},
"path": "attachment",
"ignore_unmapped": false,
"score_mode": "none",
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"collapse": {
"field": "attachment.uuid"
}
}
Как создается сопоставление:
curl -X DELETE "localhost:9200/package?pretty"
curl -X PUT "localhost:9200/package?include_type_name=true&pretty" -H 'Content-Type: application/json' -d '{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 1
}}'
curl -X PUT "localhost:9200/package/_mappings?pretty" -H 'Content-Type: application/json' -d'
{
"dynamic": false,
"properties" : {
"attachment": {
"type": "nested",
"properties": {
"uuid" : { "type" : "keyword" },
"name" : { "type" : "text" }
}
},
"uuid" : {
"type" : "keyword"
}
}
}
'
Результат запроса, сгенерированный кодом, должен выглядеть примерно так:
curl -X POST "localhost:9200/package/_count?&pretty" -H 'Content-Type: application/json' -d' { "query" :
{
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"adjust_pure_negative": true,
"boost": 1.0
}
},
"path": "attachment",
"ignore_unmapped": false,
"score_mode": "none",
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"collapse": {
"field": "attachment.uuid"
}
}'