由于我们有多个与单个文档关联的客户端,因此我尝试使用AggregationBuilders
来按其客户端名称汇总文档计数。我们正在使用嵌套字段client_name
来索引和搜索文档。
这是我的数据格式
{
"id": "5f68c6c80f52a45a0db6d470",
"name": "Mi Note 10 Lite",
"brand": {
"name": "xiaomi"
},
"client_name": [
{
"name": "client a"
},
{
"name": "client b"
}
]
}
当我尝试使用聚合过滤器搜索客户端a和b时,它将仅返回一个文档计数
"aggregations": {
"client a": {
"doc_count": 1
},
"client b": {
"doc_count": 0
},
}
我正在将Java API与弹性搜索6.3结合使用。
这是我的查询代码
boolQuery.should(new NestedQueryBuilder(CLIENT_NAME,
QueryBuilders
.termQuery(CLIENT_NAME + "." + NAME, token),ScoreMode.None));
这是我的AggregationBuilders.filter(k,v);
聚合存储桶不应该在两个存储桶上都返回doc count 1还是我遗漏了什么?
答案 0 :(得分:1)
添加包含索引数据,映射,搜索结果和搜索查询的工作示例
索引映射:
{
"mappings": {
"properties": {
"client_name": {
"type": "nested",
"properties": {
"name": {
"type": "keyword"
}
}
}
}
}
}
索引数据:
{
"id": "5f68c6c80f52a45a0db6d470",
"name": "Mi Note 10 Lite",
"brand": {
"name": "xiaomi"
},
"client_name": [
{
"name": "client a"
},
{
"name": "client b"
}
]
}
搜索查询:
{
"size" : 0,
"aggs": {
"client": {
"nested": {
"path": "client_name"
},
"aggs": {
"client_count": {
"terms": {
"field": "client_name.name"
}
}
}
}
}
}
搜索结果:
"aggregations": {
"client": {
"doc_count": 2,
"client_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "client a",
"doc_count": 1
},
{
"key": "client b",
"doc_count": 1
}
]
}
}
您可以参考此SO answer,将上面的Elasticsearch查询转换为JAVA代码。