2015-12-25 13 views
0

Для документов, какПри использовании гаусс оценки распада Funtion, он всегда забивает 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": [] 
              } 
             ] 
             } 
            ] 
           } 
          ] 
          } 

Я вижу here, что gauss явно возвращает 1, когда он не может найти поле. Но вопрос в том, почему он не может найти поле в вложенных документах и ​​как это сделать.

ответ

0

Причина 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" 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

ли эта помощь?

+0

Спасибо, но есть еще две проблемы с ним. 1: Он все равно возвращает результат 1 для всех результатов, независимо от того, имеют ли они цены или нет. [ссылка] (http://screencast.com/t/nDE7g6tLYV) 2: Я не могу добавить другие функции для родителя. Полный запрос является довольно сложным с множеством различных полей. Но я не могу понять, как добавить как вложенные, так и верхние уровни функций. – ClausP

+0

Я создал один тестовый индекс, и он работал, он дал оценку 1 только тем документам, которые не соответствовали условию. Какую версию ES вы используете? – ChintanShah25

+0

Спасибо. Кажется, сейчас работает. Я забыл добавить вес к функции, поэтому все документы, соответствующие фильтру gauss, были отсортированы ниже 1. Добавив свет, кажется, что он теперь намного лучше. Я использую версию 2.1.1 и 1.7 – ClausP