Эластичный поиск - используйте исходную оценку в качестве вторичной сортировки для function_score - PullRequest
0 голосов
/ 30 сентября 2019

Я использую 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 использовать счетчик запросов в качестве разрыва связи?

Любые подсказки приветствуются.

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