我将我的Elasticsearch查询从1.7版本迁移到5.0版本(此时为最新版本),并且我在汇总方面遇到了一些问题。
我想在给定字段上进行聚合,并显示按分数排序的前5个文档。从我所读到的,过去常常这样做:
"aggs" : {
"max_price" : { "max" : { "script" : "_score" } }
}
使用Sense,我得到的答案是" [top_score]中的意外标记VALUE_STRING [script]。"
有人经历过这个吗?
注意:对于旧版本,此处发布了答案:ElasticSearch: aggregation on _score field?
答案 0 :(得分:0)
Elasticsearch的默认脚本语言现在是无痛而不是groovy。根据{{3}},您可以尝试:
"aggs" : {
"max_price": {
"max": {
"script": {
"lang": "groovy",
"inline": "_score"
}
}
}
}
在Elasticsearch 5.x中更新,将有不推荐使用的日志,如:
[WARN] [o.e.d.d.g.groovyScriptEngineService] [groovy]脚本已弃用,请改用[无痛]脚本
更正确的方法是:
"aggs" : {
"max_price": {
"max": {
"script": {
"lang": "painless",
"inline": "_score"
}
}
}
}
答案 1 :(得分:0)
如果您只需要按分数(总体而言)搜索条件的前5个文档,您可以将查询的大小设置为5,这应该可以解决问题(例如下面)
{
"size": 5,
"query": {
"bool": {
"must": [
{
"match": {
"my_field": "whatever"
}
},
{
"match": {
"my_other_field": "whatever else"
}
}
],
"should": [],
"must_not": [],
"filter": []
}
},
"aggs": {
"something": {
"terms": {
"field": "my_term"
},
"aggs": {
"field_stats": {
"stats": {
"field": "price"
}
}
}
}
}
}
另一方面,如果您想要每个桶的前5个评分文档,您是否考虑过使用热门点击聚合? https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html