Score_mode avg возвращает 1 для всех документов - PullRequest
0 голосов
/ 12 февраля 2020

Я использую функцию Score с помощью параметра Score_mode AVG и Boost_mode. И согласно документации, я ожидаю, что оценка функции запроса будет переопределена фильтрами оценки функции (потому что я использую замену boost_mode).

Это работает, как ожидается, для суммы и умножения, но не для avg (Я знаю, что среднее значение в баллах функций - это средневзвешенное значение)

Когда я применяю эту функцию, все документы получают оценку 1.

Как это может произойти?

GET kibana_sample_data_ecommerce/_search
{
  "_source": {
    "includes": ["customer_last_name", "customer_first_name", "customer_gender"]

  }, 
  "size": 10, 
  "query": {
    "function_score": {
      "functions": [
        {
          "filter": { "match": { "customer_last_name": "Cook" } },
          "weight": 2
        },
        {
          "filter": { "match": { "customer_first_name": "Jackson" } },
          "weight": 4
        },
        {
          "filter": { "match": { "customer_gender" : "MALE"} },
          "weight": 8
        }
      ],
      "score_mode": "avg", 
      "boost_mode": "replace"
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Так что это немного странно, но ссылка, предоставленная @jzzfs, уже довольно близка. Средний режим запроса оценки функции обеспечивает взвешенное среднее значение, которое вызывает этот эффект :

В случае, если для параметра score_mode установлено значение avg, отдельные результаты будут быть объединены в среднем взвешенный . Например, если две функции возвращают оценку 1 и 2 и их соответствующие веса равны 3 и 4, то их оценки будут объединены как (1 * 3 + 2 * 4) / (3 + 4) и , а не (1 * 3 + 2 * 4) /2.

Кроме того, важно отметить, что из-за этого оценки функций, фильтры которых не соответствуют текущему документу , не имеют никакого эффекта в среднем оценка , а не ее снижение. В вашем примере это означает, что если документ совпадает только с клиентом MALE, он будет иметь оценку 8, но, поскольку он взвешен, он фактически будет иметь оценку (1*8)/8 = 1. Если это MALE с именем Jackson, счет снова будет (1*8 + 1*4)/(8+4)=1. Это легко увидеть, используя объяснение API :

GET kibana_sample_data_ecommerce/_explain/ER5Bv3ABEiTwEf3FhKws
{
  "query": {
    "function_score": {
      "functions": [
        {
          "filter": { "match": { "customer_last_name": "Cook" } },
          "weight": 2
        },
        {
          "filter": { "match": { "customer_first_name": "Jackson" } },
          "weight": 4
        },
        {
          "filter": { "match": { "customer_gender" : "MALE"} },
          "weight": 8
        }
      ],
      "score_mode": "avg", 
      "boost_mode": "replace"
    }
  }
}

возвращает

{
  "_index" : "kibana_sample_data_ecommerce",
  "_type" : "_doc",
  "_id" : "ER5Bv3ABEiTwEf3FhKws",
  "matched" : true,
  "explanation" : {
    "value" : 1.0,
    "description" : "min of:",
    "details" : [
      {
        "value" : 1.0,
        "description" : "function score, score mode [avg]",
        "details" : [
          {
            "value" : 8.0,
            "description" : "function score, product of:",
            "details" : [
              {
                "value" : 1.0,
                "description" : "match filter: customer_gender:MALE",
                "details" : [ ]
              },
              {
                "value" : 8.0,
                "description" : "product of:",
                "details" : [
                  {
                    "value" : 1.0,
                    "description" : "constant score 1.0 - no function provided",
                    "details" : [ ]
                  },
                  {
                    "value" : 8.0,
                    "description" : "weight",
                    "details" : [ ]
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "value" : 3.4028235E38,
        "description" : "maxBoost",
        "details" : [ ]
      }
    ]
  }
}
0 голосов
/ 09 марта 2020

Уже ответили здесь . Поскольку вы использовали boost_mode:replace, используются только оценки функций, а оценка запросов игнорируется. enter image description here

Исходя из этого, поскольку ваши веса одинаковы, они "компенсируют друг друга", что приводит к 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...