Я использую function_score для создания пользовательской оценки релевантности и хочу использовать исходную оценку запроса в качестве вторичной сортировки. Вот простая версия запроса.
{
"from": 0,
"size": 20,
"query": {
"function_score": {
"functions": [
{
"filter": [
{
"match": {
"keywords": {
"query": "pop",
"operator": "or"
}
}
}
],
"weight": 1400
},
{
"filter": [
{
"match": {
"genre": {
"query": "pop",
"operator": "or"
}
}
}
],
"weight": 1300
},
{
"filter": [
{
"match": {
"trackDescription": {
"query": "pop",
"operator": "or"
}
}
}
],
"weight": 1200
},
{
"filter": [
{
"match": {
"album.albumDisplayTitle": {
"query": "pop",
"operator": "or"
}
}
}
],
"weight": 1100
},
{
"filter": [
{
"term": {
"library.libraryID": "202"
}
}
],
"weight": 1050
},
{
"filter": [
{
"range": {
"releaseDate": {
"gte": "now-7d"
}
}
}
],
"weight": 2500
}
],
"score_mode": "sum",
"boost_mode": "replace",
"query": {
"bool": {
"filter": [
{
"term": {
"isAlternate": "false"
}
}
],
"must": [
{
"multi_match": {
"query": "pop",
"operator": "or",
"fields": [
"trackDisplayTitle",
"trackDescription",
"genre",
"keywords",
"lyrics",
"album.albumCDCode",
"album.albumDisplayTitle",
"album.keywords"
]
}
}
]
}
}
}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"releaseDate": {
"order": "desc"
}
}
]
}
Первым делом я попытался изменить «boost_mode» на «sum», который добавляет исходную оценку запроса к пользовательской оценке и придает ей некоторую глубину. Проблема в том, что оценка запроса не имеет границ, что означает, что она может затмить пользовательский скоринг. Я не смог найти способ нормализовать оценку запроса.
Единственное жизнеспособное решение, которое у меня есть сейчас, - это выполнить второй поиск без пользовательской сортировки и использовать полученные из этого значения для увеличения сортировки. 1-й поиск. Это выглядит очень грязно.
Есть ли лучший способ сделать это? Я бы подумал, что что-то вроде ниже будет поддержано, но это не так.
sort": [
{
"_score": {
"order": "desc"
}
},
{ // only _score variable is supported
"_queryscore": {
"order": "desc"
}
},
{
"releaseDate": {
"order": "desc"
}
}
]
Или есть какой-то способ, которым я могу сказать ES использовать счетчик запросов в качестве разрыва связи?
Любые подсказки приветствуются.