ElasticSearch: ранжирование с несколькими взвешенными функциями; при использовании random_score другие функции игнорируются

Я хочу иметь сложный рейтинг, состоящий из нескольких функций, которые я хочу взвесить и умножить на поиск _score. Я понимаю, что это возможно с параметром function_score -> functions. Вот что у меня есть (заметьте, это Python):

        "function_score": {
            "query": ...,
            "functions": [
                {
                    "random_score" : {
                        "seed":     seed
                    },
                    "weight": 0.1
                },
                {
                    "field_value_factor": {
                        "field":    "score"
                    },
                    "weight": 1
                }
            ],
            "score_mode": "multiply"
        }

Примечания:

  • В каждом документе есть поле «оценка», содержащее число от 0 до 1.
  • "seed" генерируется на основе идентификатора пользователя и текущей даты

Наблюдаемое поведение:

  • Если я закомментирую функцию field_value_factor, результаты ранжируются случайным образом.
  • Если я закомментирую функцию random_score, результаты будут отсортированы по их полю оценки.
  • Если я ничего не закомментирую, результат будет таким же, как и со случайным образом: вторая функция, кажется, игнорируется
  • Даже изменение весов на резкие значения не влияет на рейтинг.
  • Кроме того, использование "фактора" внутри функции field_value_factor ничего не дает.
  • Смена порядка тоже не меняет поведения ...

Что я делаю неправильно? Есть ли другие способы отладить это?

РЕДАКТИРОВАТЬ: объяснять вывод

Только что узнал о команде объяснения! Вот результат с наивысшим баллом. Пытаюсь осознать это ...

  "_explanation": {
      "value": 0,
      "description": "function score, product of:",
      "details": [
        {
          "value": 1,
          "description": "ConstantScore(*:*), product of:",
          "details": [
            {
              "value": 1,
              "description": "boost"
            },
            {
              "value": 1,
              "description": "queryNorm"
            }
          ]
        },
        {
          "value": 0,
          "description": "Math.min of",
          "details": [
            {
              "value": 0,
              "description": "function score, score mode [multiply]",
              "details": [
                {
                  "value": 90500,
                  "description": "function score, product of:",
                  "details": [
                    {
                      "value": 1,
                      "description": "match filter: *:*"
                    },
                    {
                      "value": 90500,
                      "description": "product of:",
                      "details": [
                        {
                          "value": 9.05,
                          "description": "field value function: (doc['score'].value * factor=10.0)"
                        },
                        {
                          "value": 10000,
                          "description": "weight"
                        }
                      ]
                    }
                  ]
                },
                {
                  "value": 0,
                  "description": "function score, product of:",
                  "details": [
                    {
                      "value": 1,
                      "description": "match filter: *:*"
                    },
                    {
                      "value": 0,
                      "description": "product of:",
                      "details": [
                        {
                          "value": 0,
                          "description": "random score function (seed: 16121)"
                        },
                        {
                          "value": 0.01,
                          "description": "weight"
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "value": 3.4028235e+38,
              "description": "maxBoost"
            }
          ]
        },
        {
          "value": 1,
          "description": "queryBoost"
        }
      ]
    }

ИЗМЕНИТЬ 2:

Таким образом, кажется, что случайная функция всегда возвращает 0, а умноженное на другие факторы, конечно, дает 0 ... Почему это так?


person cpury    schedule 08.01.2015    source источник


Ответы (1)


Я считаю, что это проблема исходной ценности, которую вы предоставляете. Начальное значение используется для вычисления случайной оценки. Одно и то же начальное значение всегда дает одно и то же случайное число.

Следовательно, если вы удалите начальное значение из своего запроса, он должен работать нормально. Вы можете обратиться к этому образцу -

"function_score": {
    "query": ...,
    "functions": [
        {
            "random_score" : {
            },
            "weight": 0.1
        },
        {
            "field_value_factor": {
                "field":    "score"
            },
            "weight": 1
        }
    ],
    "score_mode": "multiply"
}

Если вы хотите использовать начальное значение, попробуйте использовать очень большое число.

person Vineeth Mohan    schedule 10.01.2015
comment
Спасибо, но раньше я пробовал разные начальные значения, а также вообще никаких семян, но результат всегда один и тот же :( - person cpury; 10.01.2015