Есть ли способ установить диапазон баллов (или максимальный балл) для запроса

У меня очень простой запрос:

match: {
  field => {
    boost: 4,
    query: term,
    fuzziness: 'AUTO',
  }
}

Составлено с несколькими (около 10) другими запросами, большинство из которых использует constant_score. Проблема в том, что по определенным условиям мой запрос имеет слишком большую оценку, что отменяет результаты всех остальных запросов.

Вот часть объяснения:

"details" => [
[0] {
      "value" => 63.656006,
"description" => "sum of:",
    "details" => [
    [0] {
              "value" => 63.656006,
        "description" => "weight(title.de:kandinsky in 1694239) [PerFieldSimilarity], result of:",
            "details" => [
            [0] {
                      "value" => 63.656006,
                "description" => "score(doc=1694239,freq=1.0 = termFreq=1.0\n), product of:",
                    "details" => [
                    [0] {
                              "value" => 4.0,
                        "description" => "boost",
                            "details" => []
                    },
                    [1] {
                              "value" => 11.3820715,
                        "description" => "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
[...]

Разве вы можете видеть, у меня есть счет 11,38 из-за ИДФ. Мои другие запросы (с оценками от 1 до 3) абсолютно бесполезны.

Мой вопрос:

Как установить максимально возможную оценку для запроса?

Или, что еще лучше, я могу установить диапазон оценок для своего запроса?

Я хотел бы избежать запроса constant_score для этого поля, мне нужно несколько TF/IDF и оценка для этого поля, но не так сильно.

Я попробовал это:

function_score: {
  query: { match: {
    field => term,
  }},
  score_mode: :avg,
  script_score: {
    script: {
      inline: "4 * (1 + Math.log(2 + _score))",
    }
  },
}

Это лучше, но он все еще может показывать очень высокий балл в определенных случаях.

1 ответ

Наконец, я использовал функциональную оценку с помощью сценария, используя 1 - (1/x) функция в script_score

GET _search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "postgresql.log.message": "alter"
        }
      },
      "script_score" : {
                "script" : {
                    "params": {
                        "max_score": 5
                    },
                    "source": "params.max_score * (1 - 1 / _score)" 
                }
            }
    }
  }
}

Таким образом, у меня будет оценка от 0 до почти 5 (max_score).

Вы можете попробовать это здесь со словом alter (оценка 3,9150627) или alter table pgbench_branches add primary key (bid) (оценка 4,8539715).

Вы можете адаптировать 1 - (1/x) функция, чтобы приблизиться к асимптоте быстрее.

Вы пробовали использовать запрос Оценка функции? Вот ссылка для того же https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

Другие вопросы по тегам