嵌套字段类型将仅在弹性搜索中作为一个文档数进行搜索

时间:2020-09-24 07:45:53

标签: java elasticsearch

由于我们有多个与单个文档关联的客户端,因此我尝试使用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还是我遗漏了什么?

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代码。