在 script_field 值上使用弹性搜索聚合?

Posted

技术标签:

【中文标题】在 script_field 值上使用弹性搜索聚合?【英文标题】:Using elasticsearch aggregations on script_field values? 【发布时间】:2014-10-05 03:38:50 【问题描述】:

我创建了 groovy 脚本来计算新的字段值。然后,我可以在我的查询中使用该脚本来使用script_fields 参数计算新字段值。这是一个例子:


    "query": 
        "filtered": 
            "query": 
                "bool": 
                    "must": "match_all": 
                
            
        
    ,
    "script_fields":
        "my_field":
            "script_id":"my_field_calculator",
            "lang" : "groovy",
            "params": 
        
    

这工作得很好,我看到每个都有一个包含my_fieldfields 对象。完美的。

现在我想使用terms aggregation 来获取这个新字段值每次出现的计数,如下所示:


    "query": 
        "filtered": 
            "query": 
                "bool": 
                    "must": "match_all": 
                
            
        
    ,
    "script_fields":
        "my_field":
            "script_id":"my_field_calculator",
            "lang" : "groovy",
            "params": 
        
    
    "aggs": 
        "counts_by_my_field": 
            "terms": 
                "field": "my_field"
            
        
    

查询运行良好,我仍然可以在每个字段中看到我的计算结果,但是 aggregations 对象包含一个键 counts_by_my_field,其中包含一个空的 buckets 数组。

我错过了什么?是否可以在聚合中使用 script_fields?

【问题讨论】:

【参考方案1】:

这是不可能的,目前还没有。 script_fields 在聚合或构面中作为 field 放置时不起作用。

并且没有任何方法可以通过聚合访问脚本字段。见解释。

我深入研究了 Elasticsearch 的实现代码,

这是用于编写脚本的术语聚合使用的 ValuesSourceAggregationBuilder#script() 的 Javadoc。

设置生成值的脚本。如果脚本是 与字段一起配置(如在 @link #field(String) 中),然后 * 此脚本将被视为 @code value 脚本。 值脚本将应用于提取的值 从 * 字段数据(您可以使用 @code _value 保留变量在脚本中引用该值)。如果只有脚本 已配置 * (并且旁边配置了 no 字段),那么脚本将负责生成将被聚合的值。 *

这意味着,您不能将“script_id”发送到聚合。你只能这样做,

POST index/type/_search

   "aggs": 
      "name": 
         "terms": 
            "script": "_source.data[0]",
            "lang": "groovy",
            "params": 
         
      
   

希望这会有所帮助!!谢谢

【讨论】:

【参考方案2】:

虽然我无法使聚合使用 script_field 值进行聚合,但我发现了另一种方法来完成我希望做的事情。事实证明,聚合将接受一个script_id 配置,该配置可以在聚合期间计算脚本字段值。

这是我使用 script_id 作为聚合的一部分的示例:


    "query": 
        "filtered": 
            "query": 
                "bool": 
                    "must":  "match_all": 
                
            
        
    ,
    "aggs": 
        "counts_by_my_field": 
            "terms": 
                "script_id": "my_field_calculator",
                "lang" : "groovy",
                "params": 
            
        
    

【讨论】:

以上是关于在 script_field 值上使用弹性搜索聚合?的主要内容,如果未能解决你的问题,请参考以下文章

在弹性搜索中聚合值数组

如何在弹性搜索的过滤器聚合中引用多个嵌套级别?

除了依靠弹性搜索聚合之外,如何获取其他数据?

应用聚合后过滤掉弹性搜索中的术语聚合桶

将聚合限制为弹性搜索中的热门内容

是否有可能对弹性搜索中的热门命中结果进行聚合?