# Взаимодействие score в should контексте

**URL:** <https://discuss.elastic.co/t/score-should/237138>\
**Category:** Вопросы на русском языке\
**Created:** [June 15, 2020, 12:42pm UTC](https://discuss.elastic.co/t/score-should/237138 "2020-06-15T12:42:45Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Pavel\_Novoydarskiy](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavel_novoydarskiy/32/63731_2.png) [@Pavel\_Novoydarskiy](https://discuss.elastic.co/u/Pavel_Novoydarskiy)\
**Post date:** [June 15, 2020, 12:42pm UTC](https://discuss.elastic.co/t/score-should/237138/1 "2020-06-15T12:42:45Z")

</div>

Если я правильно понимаю, то в Elasticsearch на данный момент, каждый score полученный из одного should запроса, складывается с остальными, можно ли переопределить это поведение и сделать, например умножение?  
Для примера, у меня есть индекс, имеющий следующую структуру:  
{  
"some\_measures1": [{...}],  
"some\_measures2": [{...}],  
"some\_measures3": [{...}],  
"multiplier": 100  
}  
По каждому nested полю я выполняю ранжирование в should контексте. Итоговые оценки суммируются, после чего умножаются с помощью field\_value\_factor на multiplier. Вопрос заключается в том, можно ли оценки из nested запросов перемножить друг на друга вместо того, чтобы суммировать?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [June 15, 2020, 1:24pm UTC](https://discuss.elastic.co/t/score-should/237138/2 "2020-06-15T13:24:38Z")

</div>

> [@Pavel\_Novoydarskiy](#):
>
> Вопрос заключается в том, можно ли оценки из nested запросов перемножить друг на друга вместо того, чтобы суммировать?

В запросе nested, по умолчанию, [расчитывается среднее значение](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html#nested-top-level-params), а не сумма. Сумма расчитывается в bool, и это поведение изменить нельзя. Однако есть несколько других способов решить эту проблему. Можно разделить фильтрацию с рассчетом релевантности и воспользоваться [function\_score](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html). Либо [script\_score](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-score-query.html) для расчета по одной записи или для переведения релевантности в логарифимическую шкалу. Учитывая что `log(xy) = log(x) + log(y)`, можно заменить умножение на сложение.

---

<div class="post-metadata">

**Author:** ![Pavel\_Novoydarskiy](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pavel_novoydarskiy/32/63731_2.png) [@Pavel\_Novoydarskiy](https://discuss.elastic.co/u/Pavel_Novoydarskiy)\
**Post date:** [June 15, 2020, 2:30pm UTC](https://discuss.elastic.co/t/score-should/237138/3 "2020-06-15T14:30:11Z")

</div>

> Можно разделить фильтрацию с рассчетом релевантности и воспользоваться [function\_score](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html)

Не совсем понял этот момент, на данный момент я пользуюсь function score , но не нашел способа умножать оценки полученные из nested запросов друг на друга.  
Ниже приведен примерный запрос. Пробовал сделать то же самое с помощью functions в function\_score, и собирать запрос в блоке filter, но насколько я понял, filter возвращает единицу при совпадении, а не результат внутреннего function score..

```auto
{
    "function_score": {
      "field_value_factor": {
        "field": "multiplier"
      },
      "query": [
        {
          "bool": {
            "should": [
              {
                "nested": {
                  "path": "some_measures",
                  "query": {
                    "function_score": {
                      "weight": 0.5,
                      "query": {
                        "terms": {
                          "some_measures.values": [
                            "values"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
}

```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [June 15, 2020, 2:43pm UTC](https://discuss.elastic.co/t/score-should/237138/4 "2020-06-15T14:43:18Z")

</div>

Ничего не понимаю. У вас только один запрос should на что вы его собрались умножать? Вы не могли бы привести полный пример с маппингом, данными, запросами и желаемым результатом.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 13, 2020, 2:43pm UTC](https://discuss.elastic.co/t/score-should/237138/5 "2020-07-13T14:43:21Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
