我的索引具有以下映射:
"my_index": {
"mappings": {
"properties": {
"medias": {
"properties": {
"media_id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"media_type": {
"type": "long"
},
"variant": {
"properties": {
"height": {
"type": "long"
},
"url": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"width": {
"type": "long"
}
}
},
"view_count": {
"type": "long"
}
}
}
}
我想编写一个脚本来进行自定义评分,如下所示:
// "_source": "content",
"query": {
"function_score": {
"functions": [
{
"script_score": {
"script": {
"source": " (doc.medias.size() == 0 || doc.medias.view_count.size() == 0 ? 0 : doc.medias.view_count.value) "
}
}
}
],
"query": {
"match": {
"content": something"
}
},
"score_mode": "multiply"
}
}
}
但是我得到这个错误:
"caused_by": {
"type": "illegal_argument_exception",
"reason": "No field found for [medias] in mapping with types []"
}
我想我没有正确访问view_count
属性。我怎样才能做到这一点?还有一件事:medias
字段是一个数组,如果数组的大小超过1,则需要获取view_count
中的最大值。我该怎么办?
答案 0 :(得分:1)
一个好的开始!您快到了,只需访问这样的doc值即可得到所需的结果:
{
"script_score": {
"script": {
"source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].value) "
}
}
}
由于doc['medias.view_count']
实际上是一个Java列表,因此,如果需要获取最大的视图计数,可以这样进行:
{
"script_score": {
"script": {
"source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].stream().max(Long::compare).get()) "
}
}
}