带子文档计数的Elasticsearch分数



我有这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查询和script_score组件,我们访问photos数组并将具有cat == 1的元素数量乘以5。

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": "_source.photos.findAll{return it.cat == 1}.size() * 5"
          }
        }
      ]
    }
  }
}

你会得到你期望的分数,即

  • 对象1
  • 5对象2
  • 0对象3

最新更新