当使用高斯衰减分数函数时,它在嵌套元素上的分数总是1



对于等文档

{
"_id" : "abc123",
"_score" : 3.7613528,
"_source" : {
    "id" : "abc123",
    "pricePeriods" : [{
            "periodTo" : "2016-01-02",
            "eur" : 1036,
            "gbp" : 782,
            "dkk" : 6880,
            "sek" : 9025,
            "periodFrom" : "2015-12-26",
            "nok" : 8065
        }, {
            "periodTo" : "2016-06-18",
            "eur" : 671,
            "gbp" : 457,
            "dkk" : 4625,
            "sek" : 5725,
            "periodFrom" : "2016-01-02",
            "nok" : 5430
        }       ]
 }
}

我想有一个高斯衰减函数得分的价格。

我试过这样的

"query" : {
    "function_score" : {
        "functions" : [{
                "gauss" : {
                    "pricePeriods.dkk" : {
                        "origin" : "2500",
                        "scale" : "2500",
                        "decay" : 0.8
                    }
                },
                "filter" : {
                    "nested" : {
                        "filter" : {
                            "range" : {
                                "pricePeriods.periodTo" : {
                                    "gte" : "2016-03-17T00:00:00.000"
                                }
                            }
                        },
                        "path" : "pricePeriods"
                    }
                }
            }
            ]

过滤器似乎找到了我想对其进行高斯运算的价格,但得到的分数总是1。

解释说

{ "value": 1,
  "description": "min of:",
   "details": [
    {
         "value": 1,
         "description": "function score, score mode [multiply]",
          "details": [
                    {
              "value": 1,
               "description": "function score, product of:",
                 "details": [
                  {
                    "value": 1,
                       "description": "match filter: ToParentBlockJoinQuery (+ConstantScore(pricePeriods.periodTo:[[32 30 31 36 2d 30 33 2d 31 37 54 30 30 3a 30 30 3a 30 30 2e 30 30 30] TO *]) #QueryWrapperFilter(_type:__pricePeriods))",
                                         "details": []
                                      },
                                      {
                                         "value": 1,
                                         "description": "Function for field pricePeriods.dkk:",
                                         "details": [
                                            {
                                               "value": 1,
                                               "description": "exp(-0.5*pow(MIN[0.0],2.0)/1.4004437867889222E7)",
                                               "details": []
                                            }
                                         ]
                                      }
                                   ]
                                }
                             ]
                          }

我可以在这里看到,当高斯找不到场时,它显然会返回1。但问题是为什么它在嵌套文档中找不到字段,以及如何修复它。

gauss function返回1的原因是,正如您所说,它找不到字段,因为它是nested,您基本上需要将整个function_score查询封装到nested query

{
  "query": {
    "nested": {
      "path": "pricePeriods",
      "query": {
        "function_score": {
          "functions": [
            {
              "gauss": {
                "pricePeriods.dkk": {
                  "origin": "2500",
                  "scale": "2500",
                  "decay": 0.8
                }
              },
              "filter": {
                "range": {
                  "pricePeriods.periodTo": {
                    "gte": "2016-03-17T00:00:00.000"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

这有帮助吗?

最新更新