ElasticSearch Java API从查询生成器中获取不同的值
我正在使用Java API查询ElasticSearch,并获得了大量重复值。我只想从查询中获取唯一的值(不同的值)。如何从查询生成器中获取不同的值 请在下面找到我的java代码,它给出了重复的值ElasticSearch Java API从查询生成器中获取不同的值,java,
elasticsearch,elastic-stack,Java,
elasticsearch,Elastic Stack,我正在使用Java API查询ElasticSearch,并获得了大量重复值。我只想从查询中获取唯一的值(不同的值)。如何从查询生成器中获取不同的值 请在下面找到我的java代码,它给出了重复的值 QueryBuilder qb2=null; List<Integer> link_id_array=new ArrayList<Integer>(); for(Replacement link_id:linkIDList) { link_id_array.add(li
QueryBuilder qb2=null;
List<Integer> link_id_array=new ArrayList<Integer>();
for(Replacement link_id:linkIDList) {
link_id_array.add(link_id.getLink_id());
}
qb2 = QueryBuilders.boolQuery()
.must(QueryBuilders.termsQuery("id", link_id_array));
QueryBuilder qb2=null;
List link_id_array=new ArrayList();
用于(替换链接\u id:LinkId列表){
link_id_array.add(link_id.getLink_id());
}
qb2=QueryBuilders.boolQuery()
.must(QueryBuilders.termsQuery(“id”,link_id_数组));
我使用弹性搜索6.2.3版本和RestHighLevelClient方法1:您需要使用所谓的聚合API: 获取不同电子邮件客户端的示例查询:
{
"query" : {
"match_all" : { }
},
"aggregations" : {
"label_agg" : {
"terms" : {
"field" : "Email_client",
"size" : 100
}
}
}
}
Java代码示例=>
SearchRequestBuilder aggregationQuery =
client.prepareSearch("emails")
.setQuery(QueryBuilders.matchAllQuery())
.addAggregation(AggregationBuilders.terms("label_agg")
.field("Email_client").size(100));
SearchResponse response = aggregationQuery.execute().get();
Aggregation aggregation = response.getAggregations().get("label_agg");
StringTerms st = (StringTerms) aggregation;
return st.getBuckets().stream()
.map(bucket -> bucket.getKeyAsString())
.collect(toList());
AggregationBuilder agg11 = AggregationBuilders.cardinality("distinct").field("Email_client");
SearchResponse response11 = client.prepareSearch("emails")// we can give multiple index names here
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(query11)
.addAggregation(agg11)
.setExplain(true)
.setSize(0)
.get();
方式2:
使用聚合Api的基数:
elasticquery示例:
{
"size": 0,
"aggs": {
"distinct": {
"cardinality": {
"field": "Email_client",
"size" : 100
}
}
}
Java代码示例=>
SearchRequestBuilder aggregationQuery =
client.prepareSearch("emails")
.setQuery(QueryBuilders.matchAllQuery())
.addAggregation(AggregationBuilders.terms("label_agg")
.field("Email_client").size(100));
SearchResponse response = aggregationQuery.execute().get();
Aggregation aggregation = response.getAggregations().get("label_agg");
StringTerms st = (StringTerms) aggregation;
return st.getBuckets().stream()
.map(bucket -> bucket.getKeyAsString())
.collect(toList());
AggregationBuilder agg11 = AggregationBuilders.cardinality("distinct").field("Email_client");
SearchResponse response11 = client.prepareSearch("emails")// we can give multiple index names here
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(query11)
.addAggregation(agg11)
.setExplain(true)
.setSize(0)
.get();
Way1出现异常“无效术语聚合器顺序路径[\u key]。未知聚合[\u key]”}],“类型”:“搜索阶段执行\u异常”@rogger2016{“类型”:“聚合执行\u异常”,“原因”:“无效术语聚合器顺序路径[\u key]。未知聚合[\u key]”}面临相同错误。您找到了解决方案吗?第二种方法给出了重复的值。这两种解决方案对我都不起作用