Я пытаюсь сделать приведенный ниже запрос эластичного поиска для работы с данными пружины. Цель - вернуть уникальные результаты для поля "serviceName"
. Точно так же, как SELECT DISTINCT serviceName FROM table
сравнивал бы с базой данных SQL.
{
"aggregations": {
"serviceNames": {
"terms": {
"field": "serviceName"
}
}
},
"size":0
}
Я настроил поле в качестве ключевого слова, и оно прекрасно работало в API index_name/_search
согласно приведенному ниже фрагменту ответа:
"aggregations": {
"serviceNames": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "service1",
"doc_count": 20
},
{
"key": "service2",
"doc_count": 8
},
{
"key": "service3",
"doc_count": 8
}
]
}
}
Моя проблема в том, что тот же запрос не работает в данных Spring, когда я пытаюсь запустить с StringQuery
Я получаю ошибку ниже. Я предполагаю, что он использует другой API для выполнения запросов.
Cannot execute jest action , response code : 400 , error : {"root_cause":[{"type":"parsing_exception","reason":"no [query] registered for [aggregations]","line":2,"col":19}],"type":"parsing_exception","reason":"no [query] registered for [aggregations]","line":2,"col":19} , message : null
Я пытался использовать тип SearchQuery
для достижения тех же результатов, без дубликатов и загрузки объектов, но мне не повезло. Приведенный ниже sinnipet показывает, как я пытался это сделать.
final TermsAggregationBuilder aggregation = AggregationBuilders
.terms("serviceName")
.field("serviceName")
.size(1);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices("index_name")
.withQuery(matchAllQuery())
.addAggregation(aggregation)
.withSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.withSourceFilter(new FetchSourceFilter(new String[] {"serviceName"}, new String[] {""}))
.withPageable(PageRequest.of(0, 10000))
.build();
Кто-нибудь знает, как добиться отсутствия загрузки объекта и четкого агрегирования свойств объекта в данных пружины?
Я много раз безуспешно пытался напечатать запросы к данным Spring, но не смог, может быть, потому что я использую реализацию com.github.vanroy.springdata.jest.JestElasticsearchTemplate
.
Я получил запрос частей со следующим:
logger.info("query:" + searchQuery.getQuery());
logger.info("agregations:" + searchQuery.getAggregations());
logger.info("filter:" + searchQuery.getFilter());
logger.info("search type:" + searchQuery.getSearchType());
Он печатает:
query:{"match_all":{"boost":1.0}}
agregations:[{"serviceName":{"terms":{"field":"serviceName","size":1,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]}}}]
filter:null
search type:DFS_QUERY_THEN_FETCH