Spring数据聚合查询elasticsearch

Spring数据聚合查询elasticsearch,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我尝试使用下面的elasticsearch查询来处理spring数据。其目的是为字段“serviceName”返回唯一的结果。就像一个从表中选择不同的serviceName与一个SQL数据库进行比较一样 { “聚合”:{ “服务名称”:{ “条款”:{ “字段”:“serviceName” } } }, “大小”:0 } 我将该字段配置为关键字,它使查询在index\u name/\u searchapi中完美工作,如下面的响应片段所示: “聚合”:{ “服务名称”:{ “单据计数错误上限”:

我尝试使用下面的elasticsearch查询来处理spring数据。其目的是为字段
“serviceName”
返回唯一的结果。就像一个
从表中选择不同的serviceName
与一个SQL数据库进行比较一样

{
“聚合”:{
“服务名称”:{
“条款”:{
“字段”:“serviceName”
}
}
},
“大小”:0
}
我将该字段配置为关键字,它使查询在
index\u name/\u search
api中完美工作,如下面的响应片段所示:

“聚合”:{
“服务名称”:{
“单据计数错误上限”:0,
“合计其他单据数”:0,
“桶”:[
{
“密钥”:“服务1”,
“文件计数”:20
},
{
“密钥”:“服务2”,
“单据计数”:8
},
{
“密钥”:“服务3”,
“单据计数”:8
}
]
}
}
我的问题是,当我尝试使用
StringQuery
运行时,相同的查询在Spring数据中不起作用,我得到以下错误。我猜它使用不同的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
.条款(“服务名称”)
.field(“serviceName”)
.尺寸(1);
SearchQuery SearchQuery=new NativeSearchQueryBuilder()
.带索引(“索引名称”)
.withQuery(matchAllQuery())
.addAggregation(聚合)
.withSearchType(SearchType.DFS\u QUERY\u然后\u FETCH)
.withSourceFilter(新的FetchSourceFilter(新字符串[]{“serviceName”},新字符串[]{“}))
.withPageable(第页请求,共(0,10000))
.build();
有人知道如何在spring数据上实现无对象加载和对象属性不同的聚合吗

我尝试了很多方法都没有成功地打印spring数据的查询,但是我做不到,可能是因为我正在使用
com.github.vanroy.springdata.jest.JestElasticsearchTemplate
实现。 我得到了以下查询部分:

logger.info(“查询:+searchQuery.getQuery());
info(“agregations:+searchQuery.getAggregations());
info(“过滤器:+searchQuery.getFilter());
logger.info(“搜索类型:+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


我想,也许你能帮助别人。聚合不随查询结果一起提供,而是以其自身的结果提供,并且没有映射到任何对象。显然,所得到的对象结果是elasticsearch为运行聚合所做的查询示例(可能不确定)。 最后,我创建了一个方法,可以模拟SQL
上的内容,从表中选择不同的\u列,但我认为这只适用于关键字字段,如果我没有错的话,它们的限制是256个字符。我在评论中解释了一些行。
谢谢@Val,因为我只有在调试成Jest代码并检查生成的请求和原始响应时才能理解它

public List getDistinctField(字符串字段名){
列表结果=新建ArrayList();
试一试{
最后一个字符串distinctAggregationName=“distinct\u field”;//命名聚合
最终术语SAGGREGATIONBuilder聚合=聚合生成器
.术语(distinctAggregationName)
.field(字段名)
.size(10000);//限制聚合列表的数量,我的可能很大,调整你的
SearchQuery SearchQuery=new NativeSearchQueryBuilder()
.WithIndex(“您的索引”)//可能可以省略
.addAggregation(聚合)
.withSourceFilter(new FetchSourceFilter(new String[]{fieldName},new String[]{”“}))//过滤它以仅检索我们感兴趣的字段,可能我们可以去掉它。
.withPageable(PageRequest.of(0,1))//不能为零,并且我不希望每次运行时加载10个结果,它将始终返回一个对象,因为我在查询生成器中找不到“大小”:0
.build();
//因为com.github.vanroy.springdata.jest.JestElasticsearchTemplate没有ResultExtractor的实现,所以必须使用JestResultsExtractor,如果使用Spring默认值,则可能可以使用它。
最终JestResultsExtractor提取器=新的JestResultsExtractor(){
@凌驾
公共SearchResult摘录(SearchResult SearchResult){
返回搜索结果;
}
};
最终搜索结果SearchResult=((JestElasticsearchTemplate)elasticsearchOperations)。查询(searchQuery,
提取器);
final MetricAggregation aggregations=searchResult.getAggregations();
final TermsAggregation TermsAggregation=aggregations.getTermsAggregation(distinctAggregationName);//这是聚合结果的位置,在“bucket”中。
结果=termsAggregation.GetBucket().parallelStream().map(termsAggregation.Entry::getKey)
.collect(Collectors.toList());
}捕获(例外e){
//在这里威胁你的错误。
e、 printStackTrace();
}
返回结果;
}

您能打印出由Spring数据生成的查询吗?感谢您阅读@Val,我尝试了以我所能的方式添加查询,如果您有任何添加查询的技巧,欢迎使用,我不能使用
logging.level.org.springframework.data.elasticsearch.core=DEBUG
如果您使用u