当我搜索elasticsearch聚合时,我只找到用于按多个字段分组的multi_terms。但我正在寻找如何用多个值对一个字段进行分组。
我有一个字段product,它的值可以是fruit、electronic、veg、furniture等。我喜欢按值为fruit或veg的所有文档分组。我怎样才能做到这一点?
我正在寻找一种不更新索引映射的方法。由于product的值经常更改,所以我需要在运行时支持组字段的任何组合。
发布于 2022-10-26 06:35:35
您可以使用脚本和术语聚合。
我使用了映射,这是一个脚本,它将为产品蔬菜和水果发出单个值,您可以使用这些值来分组数据。
还可以对运行时字段进行索引以提高性能。
{
"runtime_mappings": {
"product_custom": {
"type": "keyword",
"script": {
"source": """
if(doc["product.keyword"].value=="vegetable"
|| doc["product.keyword"].value=="fruit")
{
emit("vegetable/fruit");
}
else
{
emit(doc["product.keyword"].value);
}
"""
}
}
},
"aggs": {
"product_custom": {
"terms": {
"field": "product_custom"
}
}
}
}结果
"aggregations" : {
"product_custom" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "vegetable/fruit",
"doc_count" : 3
},
{
"key" : "electronic",
"doc_count" : 1
}
]
}
}更新
运行时字段可从7.11版本起使用。
您还可以使用术语聚合脚本来实现相同的目标。
{
"aggs": {
"product_custom": {
"terms": {
"script": {
"source": """
if(doc["product.keyword"].value=="vegetable"
|| doc["product.keyword"].value=="fruit")
{
return "vegetable/fruit";
}
else
{
return doc["product.keyword"].value;
}
"""
}
}
}
}
}脚本和运行/时间映射很慢,因为所有工作都是在搜索时完成的。可以将运行时字段添加到索引中,而无需重新创建索引。它将提供比脚本更好的性能。
https://stackoverflow.com/questions/74203342
复制相似问题