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... Почему это так?
1 ответ
Я чувствую, что это проблема с начальной ценностью, которую вы предоставляете. Начальное значение используется для вычисления случайной оценки. Одно и то же начальное значение всегда дает одно и то же случайное число.
Следовательно, если вы удалите начальное значение из вашего запроса, оно должно работать нормально. Вы можете обратиться к этому образцу -
"function_score": {
"query": ...,
"functions": [
{
"random_score" : {
},
"weight": 0.1
},
{
"field_value_factor": {
"field": "score"
},
"weight": 1
}
],
"score_mode": "multiply"
}
Если вы хотите использовать начальное значение, попробуйте использовать очень большое число.