我有这3个对象(3个用户有照片,每张照片都有一个类别ID)
{
"id": 1,
"name": "User1",
"photos":[
{
"id": 1,
"cat": 1
},
{
"id": 2,
"cat": 1
},
{
"id": 3,
"cat": 2
}
]
}
{
"id": 2,
"name": "User2",
"photos":[
{
"id": 4,
"cat": 1
},
{
"id": 5,
"cat": 2
},
{
"id": 6,
"cat": 2
}
]
}
{
"id": 3,
"name": "User3",
"photos":[
{
"id": 7,
"cat": 2
},
{
"id": 8,
"cat": 3
},
{
"id": 9,
"cat": 3
}
]
}
我想给这些文档打一个分数(最高分为10分),具体取决于他们与cat在一起的照片数量= 1
Object1 : 2 objects with cat = 1
Object2 : 1 objects with cat = 1
Object3 : 0 objects with cat = 1
所以分数将是Object1 = 10,Object2 = 5,Object3 = 0
最佳答案
@eemp所说的话,或者如果您无法修改文档编制索引的方式和/或如果您无法修改映射,那么一种解决方案是利用 function_score
query和 script_score
组件来访问photos
数组并乘以5。具有cat == 1
的元素数。
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": "_source.photos.findAll{return it.cat == 1}.size() * 5"
}
}
]
}
}
}
您将获得期望的分数,即
对象1的
关于elasticsearch - 带有子文档计数的Elasticsearch分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178227/