elasticsearch:为数组的每个匹配添加权重

elasticsearch: Add weight for each match of array

我想为每个匹配添加一个权重(而不是在其中一个匹配时添加一次权重):

拥有这样的文档:

[{
    "username": "xyz",
    "categories": [
        {
            "category.id": 1
        },
        {
            "category.id": 2
        }
    ]
}, {
    "username": "xyz2",
    "categories": [
        {
            "category.id": 1
        }
    ]
}]

目前,我有这个查询:

{
    "query": {
        "filtered": {
            "query": {
                "function_score": {
                    "query": {
                        "bool": {}
                    },
                    "score_mode": "sum",
                    "boost_mode": "sum",
                    "functions": [
                        {
                            "weight": 1.1,
                            "filter": {
                                "terms": {
                                    "category.id": [
                                        1,
                                        2
                                    ]
                                }
                            }
                        }
                    ]
                }
            },
            "filter": {
                "bool": {
                    "must_not": [
                        {
                            "terms": {
                                "_id": [
                                    8
                                ]
                            }
                        }
                    ]
                }
            }
        }
    },
    "from": 0,
    "size": 30
}

对于此查询,两个条目都将收到 1.1 的单个权重,但我希望第一个条目获得 2 * 1.1,因为匹配了 2 个类别。我怎样才能做到这一点?

编辑:抱歉,我错过了添加弹性搜索版本。这是 1.7.2.

这可能有点麻烦,因为对于多个 ID,查询将需要有多个语句,但我认为没有其他方法。另外,请注意您的字段引用不完整 - 它应该是 categories.category.id 才正确。另外,在字段名称中使用点进行升级时要小心。随着时间的推移,这在某些版本中发生了变化。

{
  "query": {
    "filtered": {
      "query": {
        "function_score": {
          "query": {
            "match_all": {}
          },
          "score_mode": "sum",
          "boost_mode": "sum",
          "functions": [
            {
              "weight": 1.1,
              "filter": {
                "term": {
                  "categories.category.id": 1
                }
              }
            },
            {
              "weight": 1.1,
              "filter": {
                "term": {
                  "categories.category.id": 2
                }
              }
            }
          ]
        }
      },
      "filter": {
        "bool": {
          "must_not": [
            {
              "terms": {
                "_id": [
                  8
                ]
              }
            }
          ]
        }
      }
    }
  },
  "from": 0,
  "size": 30
}