我的索引具有以下映射:
"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
的最大值。我怎样才能做到这一点?
最佳答案
伟大的开始!您快要准备好了,您只需要访问doc值,就可以得到所需的结果:
{
"script_score": {
"script": {
"source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].value) "
}
}
}
由于doc['medias.view_count']
实际上是Java列表,因此,如果需要获取最大的 View 计数,可以这样进行: {
"script_score": {
"script": {
"source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].stream().max(Long::compare).get()) "
}
}
}
关于elasticsearch - 如何在Elasticsearch脚本中访问数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63807096/