我在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,它不允许编写脚本。
答案 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。
希望这有帮助!