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

时间:2017-05-02 08:44:33

标签: elasticsearch scoring

我想为每场比赛添加一个重量(如果其中一个匹配,则不添加一个重量):

拥有这样的文档:

[{
    "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,因为有两个类别匹配。我怎么能实现这一目标?

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

1 个答案:

答案 0 :(得分:1)

这可能有点麻烦,因为对于多个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
}