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