即使字段的映射位于`text`和`keyword`类型上,也如何对sum和avg`进行聚合?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使字段的映射位于`text`和`keyword`类型上,也如何对sum和avg`进行聚合?相关的知识,希望对你有一定的参考价值。

我正在尝试对我的Elasticsearch查询执行sumavg聚合,一切工作都很好,但是我遇到了一个问题-我想对我的nested字段执行上述汇总在text / keyword类型上。

之所以如此,是因为如果需要这些特定的嵌套字段和子字段,我们在执行keywords API时将使用search分析器。

这是我的映射:

"eng" : {
  "type" : "nested",
  "properties" : {
    "date_updated" : {
      "type" : "long"
    },
    "soc_angry_count" : {
      "type" : "float"
    },
    "soc_comment_count" : {
      "type" : "float"
    },
    "soc_dislike_count" : {
      "type" : "float"
    },
    "soc_eng_score" : {
      "type" : "float"
    },
    "soc_er_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_haha_count" : {
      "type" : "float"
    },
    "soc_kf_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_like_count" : {
      "type" : "float"
    },
    "soc_love_count" : {
      "type" : "float"
    },
    "soc_mm_score" : {
      "type" : "float"
    },
    "soc_sad_count" : {
      "type" : "float"
    },
    "soc_save_count" : {
      "type" : "float"
    },
    "soc_share_count" : {
      "type" : "float"
    },
    "soc_te_score" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "soc_view_count" : {
      "type" : "float"
    },
    "soc_wow_count" : {
      "type" : "float"
    }
  }
}

请关注soc_er_score嵌套字段的soc_kf_scoresoc_te_scoreeng子字段...

[当我执行以下aggs时,它工作正常:

'aggs' => [
    'ENGAGEMENT' => [
        'nested' => [
            'path' => "eng"
        ],
        'aggs' => [
            'ARTICLES' => [
                //Use Histogram because the pub_date is of
                //long data type
                //Use interval 86400 to represent 1 day
                'histogram' => [
                    'field'  => "eng.date_updated",
                    "interval" => "86400",
                ],
                'aggs'= [
                    'SUM' => [
                        'sum' => [
                            "field" => "eng.soc_like_score"
                        ]
                    ]
                ]
            ]
        ]
    ]
]

这是完成search API之后的输出

enter image description here

BUT如果查询是这样的:

'aggs' => [
    'ENGAGEMENT' => [
        'nested' => [
            'path' => "eng"
        ],
        'aggs' => [
            'ARTICLES' => [
                //Use Histogram because the pub_date is of
                //long data type
                //Use interval 86400 to represent 1 day
                'histogram' => [
                    'field'  => "eng.date_updated",
                    "interval" => "86400",
                ],
                'aggs'= [
                    'SUM' => [
                        'sum' => [
                            "field" => "eng.soc_te_score"
                        ]
                    ]
                ]
            ]
        ]
    ]
]

输出看起来像这样:

enter image description here

已执行解决方案

解决方案1(用于确认)阅读了一些详尽的论坛讨论后,我了解到可以进行基于Java的解析,但似乎无法正常工作]

这是我修改后的查询:

'aggs'= [
    'SUM' => [
        'sum' => [
            "field" => "Float.parseFloat(eng.soc_te_score).value"
        ]
    ]
]

但是很遗憾,它以null0 values

进行响应

enter image description here

顺便说一下,我使用Laravel作为我的Web框架,这就是为什么这就是我的调试器或错误消息窗口的样子

请请求您的帮助,在此先谢谢您!

答案

除了关键字one之外,我还将创建另一个数字子字段。因此,您可以将关键字字段用于搜索,将数字字段用于聚合。

例如,像这样修改映射:

"soc_er_score" : {
  "type" : "text",
  "fields" : {
    "keyword" : {
      "type" : "keyword",
      "ignore_above" : 256
    },
    "numeric" : {
      "type" : "long",
      "ignore_malformed": true
    }
  }
},

然后您可以使用:

  • soc_er_score用于全文搜索
  • [soc_er_score.keyword用于排序,术语汇总和精确匹配
  • [soc_er_score.numeric对于sum和其他度量标准聚合。

以上是关于即使字段的映射位于`text`和`keyword`类型上,也如何对sum和avg`进行聚合?的主要内容,如果未能解决你的问题,请参考以下文章

ES 关于text和keyword两种类型数据搜索区别

Elasticsearch中Text和Keyword类型的区别

elasticsearch的keyword与text的区别

elasticsearch的keyword与text的区别

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

商城项目18_esMapping字段映射常用类型数据迁移ik分词器自定义分词器