复合字段(copy_to)的聚合不适用于Elasticsearch

时间:2016-01-28 23:52:04

标签: amazon-web-services elasticsearch aggregation

我在Elasticsearch(v 1.5.0)中有一个索引,其映射如下所示:

{
  "storedash": {
    "mappings": {
      "outofstock": {
        "_ttl": {
          "enabled": true,
          "default": 1296000000
        },
        "properties": {
          "CompositeSKUProductId": {
            "type": "string"
          },
          "Hosts": {
            "type": "nested",
            "properties": {
              "HostName": {
                "type": "string"
              },
              "SKUs": {
                "type": "nested",
                "properties": {
                  "CompositeSKUProductId": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "Count": {
                    "type": "long"
                  },
                  "ProductId": {
                    "type": "string",
                    "index": "not_analyzed",
                    "copy_to": [
                      "CompositeSKUProductId"
                    ]
                  },
                  "SKU": {
                    "type": "string",
                    "index": "not_analyzed",
                    "copy_to": [
                      "CompositeSKUProductId"
                    ]
                  }
                }
              }
            }
          },
          "Timestamp": {
            "type": "date",
            "format": "dateOptionalTime"
          }
        }
      }
    }
  }
}

查看如何创建字段 CompositeSKUProductId 作为SKU和ProductId字段的组合。

我现在想在那个复合字段上执行聚合,但它似乎不起作用;我的查询的相关部分如下所示:

        "aggs": {
            "hostEspecifico": {
                "filter": {
                    "term": { "Hosts.HostName": "www.example.com"}
                },
                "aggs": {
                    "skus": {
                        "nested": {
                            "path": "Hosts.SKUs"
                        },
                        "aggs": {
                            "valores": {
                                "terms": { 
                                    "field": "Hosts.SKUs.CompositeSKUProductId", "order": { "media": "desc" }, "size": 100 },
                                "aggs": {
                                    "media": {
                                        "avg": {
                                            "field": "Hosts.SKUs.Count"
                                        }
                                    }

                                }
                            }
                        }
                    }
                }
            }
        }

事情是,这个聚合返回零桶,好像它甚至没有。

如果只是通过 ProductId 等其他字段更改 CompositeSKUProductId ,我检查了同样的查询。

有什么想法可以解决我的问题?

N.B。:我正在使用AWS Elasticsearch Service,它不允许编写脚本。

2 个答案:

答案 0 :(得分:1)

为了copy_to嵌套文档中的另一个字段,您需要提供要在映射中复制到的字段的完整路径。您只提供了“CompositeSKUProductId”,这会导致数据被复制到根文档中的字段,而不是嵌套的SKU类型文档。

尝试将您的“SKU”类型的映射更新为copy_to完全限定字段“Hosts.SKUs.CompositeSKUProductId”。

像这样:

{
  "storedash": {
    "mappings": {
      "outofstock": {
        "_ttl": {
          "enabled": true,
          "default": 1296000000
        },
        "properties": {
          "CompositeSKUProductId": {
            "type": "string"
          },
          "Hosts": {
            "type": "nested",
            "properties": {
              "HostName": {
                "type": "string"
              },
              "SKUs": {
                "type": "nested",
                "properties": {
                  "CompositeSKUProductId": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "Count": {
                    "type": "long"
                  },
                  "ProductId": {
                    "type": "string",
                    "index": "not_analyzed",
                    "copy_to": [
                      "Hosts.SKUs.CompositeSKUProductId"
                    ]
                  },
                  "SKU": {
                    "type": "string",
                    "index": "not_analyzed",
                    "copy_to": [
                      "Hosts.SKUs.CompositeSKUProductId"
                    ]
                  }
                }
              }
            }
          },
          "Timestamp": {
            "type": "date",
            "format": "dateOptionalTime"
          }
        }
      }
    }
  }
}

当在github上打开类似问题时,您可能会发现this discussion有帮助。

答案 1 :(得分:1)

这里的问题是你误解了copy_to功能的概念。它只是复制各个字段的字段值,并且不会以您期望的方式组合

如果 SKU 为123且产品ID 为456,那么复合字段会将它们设为单独的值而不是 123 456 < / em>的。您可以通过查询字段来验证这一点。

您必须在服务器端执行此操作,理想情况下使用脚本,但不允许这样做。我们个人使用AWS ES服务但面临多个问题,主要是无法更改elasticsearch.yml文件而无法使用脚本。你可能想看看Found。

希望这有帮助!