有个人长的像洋葱,走着走着就哭了…….

elasticsearch中使用query后的_score字段来聚合的方法?

Elasticsearch | 作者 mulianghai | 发布于2016年09月11日 | 阅读数:12235

初学elasticsearch哈,我发现ES提供了聚合的一系列方法,不过有个问题在于,聚合的时候,我们求sum,求avg什么的,都是用的_source中的字段,但我不知道怎么利用query中的_score字段,比如这样:
 
{
  "query": {
    "match_phrase": {
      "usercomment": "重生"
    }
  },
  "aggs": {
    "books": {
      "terms": {
        "field": "book_id"
      },
      "aggs": {
        "avg_rating": {
          "avg": {
            "field": "_score"
          }
        }
      }
    }
  }
}
 
但是结果中:
 
{

key: ObjectId(5533475d271af03a5bd29df4)
doc_count: 191
avg_rating: {

value: null

}

}
 
avg_rating的value是null,似乎找不到前面query结果中的_score项目,所以这里请教一下,要引用_source之外的_score字段该怎么办?
已邀请:

cq1988114

赞同来自: mulianghai

我知道了。
      "aggs": {
        "avg_rating": {
          "avg": {
            "script": "_score"
          }
        }
      }
聚合部分这样写就可以了,如果script报
【scripts of type [inline], operation [aggs] and lang [groovy] are disabled】的错误
就在
就在配置文件elasticsearch.yml里

script.inline: on
script.indexed: on
script.engine.groovy.inline.aggs: on
script.engine.groovy.inline.update: on这几行配置加上然后重启els就可以了
 
我已经使用在了生产环境,是没有问题的。这个问题纠结了几天,终于找到方法了,跟帖在这里。

martindu - 搜披露创始人

赞同来自: mulianghai

FunctionScoreQuery里面可以选择自定义打分和_score的结合方式,比如求和、替代、最大最小什么的。如果是script的话可能支持更多,具体参考https://www.elastic.co/guide/e ... .html
 
我不太理解对这个_score求平均的意义在于?

medcl - 今晚打老虎。

赞同来自:

试试这个,在脚本里访问,https://www.elastic.co/guide/e ... .html

要回复问题请先登录注册