【问题标题】:Nested field type will only search as one doc count in elastic search嵌套字段类型将仅作为弹性搜索中的一个文档计数进行搜索
【发布时间】:2020-09-24 20:02:09
【问题描述】:

我正在尝试使用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
     },
}

我正在使用带有弹性搜索 6.3 的 java API。

这是我的查询代码

boolQuery.should(new NestedQueryBuilder(CLIENT_NAME,
                        QueryBuilders
                                .termQuery(CLIENT_NAME + "." + NAME, token),ScoreMode.None));

这是我的AggregationBuilders.filter(k,v);

聚合存储桶不应该在两个存储桶上都返回 doc count 1 还是我遗漏了什么?

【问题讨论】:

  • 请发布您请求的完整汇总部分

标签: java elasticsearch


【解决方案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代码。

【讨论】:

  • 另一个建议,使用“keyword”而不是“text”映射来让整个字符串“client a”而不是“client”和“a”的单独存储桶。您可以在“名称”下使用“关键字”类型更改或添加多字段,并在“名称.关键字”字段上进行聚合。
  • @TomElias 已更新答案。感谢您指出这一点 :) 如果您喜欢,请不要忘记支持我的回答 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2020-06-14
  • 1970-01-01
  • 2018-11-05
  • 2017-09-01
  • 2016-08-19
相关资源
最近更新 更多