从聚合中的备用字段返回键值

Mal*_*tis 10 elasticsearch

是否可以让Elastic Search根据不同的文档字段返回聚合键?

我们将外部id和外来名称都放在我们的类型中,然后聚合id,但是想要返回名称.名称不是唯一的,因此它们不适合聚合.我知道它们在记录集上也不一定是唯一的,但是它会接受从集合中的单个记录中采样的名称.

例如,假设我们的数据与产品的销售有关.每次销售都有与之关联的产品ID和产品名称.

// Sales
{ "product_id": 1, "product_name": "Beer", "quantity": 3, … }
{ "product_id": 1, "product_name": "Beer", "quantity": 2, … }
{ "product_id": 2, "product_name": "Wine", "quantity": 6, … }
Run Code Online (Sandbox Code Playgroud)

查询:

"aggregations": {
    "product": {
      "terms": {
        "field": "product_id"
      },
      "aggregations": {
        "day": {
          "count": {
            "value_count": {
              "field": "quantity"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

结果:

…
"aggregations": {
  "product": {
    "buckets": [
    {
      "key": "1",
      "doc_count": 2,
      "count": {
        "value": 5
      }
    },{
      "key": "2",
      "doc_count": 1,
      "count": {
        "value": 6
    }
    ]
  }
}
…
Run Code Online (Sandbox Code Playgroud)

通缉结果:

…
"aggregations": {
  "product": {
    "buckets": [
    {
      "key": "Beer",
      "doc_count": 2,
      "count": {
        "value": 5
      }
    },{
      "key": "Wine",
      "doc_count": 1,
      "count": {
        "value": 6
    }
    ]
  }
}
…
Run Code Online (Sandbox Code Playgroud)

在阅读了关于脚本的文档之后,我认为这不可行,因为它仅对值进行评估,并且似乎无法访问整个文档(因为没有文档,而是一组文档).

rja*_*ong 5

如果您仅使用 script 属性,则可以使用脚本来完成此操作(这样就可以访问整个文档)。然后将其拆分到您的客户端:例如

"aggs": {
    "types_of": {
      "terms": {
        "script": "doc['product_name'].value + '|' + doc['product_id'].value"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


小智 0

如果您对索引过程拥有所有权力,我建议您根据product_id 自行添加一个新字段(未分析),然后聚合该字段。

我不认为(但我可能是错的)你想做的事情是不可能的。