При использовании функции оценки гауссова спада она всегда получает 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, когда не может найти поле. Но вопрос в том, почему он не может найти поле во вложенных документах и ​​как это сделать.

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"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

Это помогает?

Другие вопросы по тегам