即使字段的映射位于`text`和`keyword`类型上,也如何对sum和avg`进行聚合?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使字段的映射位于`text`和`keyword`类型上,也如何对sum和avg`进行聚合?相关的知识,希望对你有一定的参考价值。
我正在尝试对我的Elasticsearch查询执行sum
和avg
聚合,一切工作都很好,但是我遇到了一个问题-我想对我的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_score
,soc_te_score
和eng
子字段...
[当我执行以下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之后的输出
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"
]
]
]
]
]
]
]
输出看起来像这样:
已执行解决方案
解决方案1(用于确认)阅读了一些详尽的论坛讨论后,我了解到可以进行基于Java的解析,但似乎无法正常工作]
这是我修改后的查询:
'aggs'= [
'SUM' => [
'sum' => [
"field" => "Float.parseFloat(eng.soc_te_score).value"
]
]
]
但是很遗憾,它以null或0 values
顺便说一下,我使用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`进行聚合?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch中Text和Keyword类型的区别