Как получить _score вместо null при использовании Script для сортировки результатов в Elasticsearch - PullRequest
3 голосов
/ 21 апреля 2020

При использовании сценария для сортировки результатов запроса, почему Elasticsearch дает нулевое значение вместо фактического значения.

Я использую этот простой сценарий для целей тестирования.

PUT _scripts/simple_sorting
{
  "script" :{
    "lang": "painless",
    "source": """
      return  Math.random();
    """
  }
}

И запрос

GET some_index/_search
{
  "explain": true, 
    "stored_fields": [
      "_source"
      ], 
    "sort": {
      "_script":{
        "type" : "number",
        "script" : {
          "id": "simple_sorting"
        },
        "order" : "desc"

      }
    },
    "query" : {
      "bool": {
        "should": [
          {
            "match": {
              "tm_applied_for": {
                "query": "bisire"
              }
            }
          }
        ]
      }
    }
}

Запрос дает мне результат, который выглядит следующим образом.

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 20,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_shard" : "[some_index][0]",
        "_node" : "UIMgEAZNRzmIpRGyQt232g",
        "_index" : "some_index",
        "_type" : "_doc",
        "_id" : "1171229",
        "_score" : null,
        "_source" : {
          "status" : "Registered",
          "proprietor_name
.
.
.
.
          "@timestamp" : "2020-03-27T20:05:25.753Z",
          "tm_applied_for_anan" : "BISLERI"
        },
        "sort" : [
          0.28768208622932434
        ],

Вы можете видеть, что max_score и _score значения равны нулю. Но он дает значение в массиве sort , в соответствии с которым эластичный поиск отсортировал документы.

Я хочу получить исходную оценку, которую Elasticsearch дал Query до того, как я использовал сценарий для sort, будет возвращено вместо null.

Также, когда я изменяю скрипт simple_sorting следующим образом. Я получаю некоторое значение в массиве sort (скажем, 0.234 ... ), которое не равно тому, что было возвращено ранее (скажем, 12.1234 ... ), когда я не использовал сценарий для сортировки.

PUT _scripts/simple_sorting
{
  "script" :{
    "lang": "painless",
    "source": """
      return  _score;
    """
  }
}

Почему значение _score не совпадает одновременно?

Когда Elasticsearch Документация явно говорит, что я могу получить доступ к _score при использовании сценария для сортировки.

То, что я ожидаю, когда я использую сценарий для сортировки, таково.

1) max_score и _score , чтобы остаться в том виде, как оно было задано Elasticsearch вместо того, чтобы стать нулевым.

2) Сортировка произойдет на основание Math.random () значение.

1 Ответ

1 голос
/ 21 апреля 2020

Это поведение по умолчаниюasticsearch, так как вы используете свой собственный лог c для сортировки результатов и, следовательно, он пропускает счет. Для того, чтобы по-прежнему получать оценку, установите для параметра track_scores значение true. Это даст вам расчет релевантности эластичного поиска.

GET some_index/_search
{
  "explain": true,
  "stored_fields": [
    "_source"
  ],
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "id": "simple_sorting"
      },
      "order": "desc"
    }
  },
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "tm_applied_for": {
              "query": "bisire"
            }
          }
        }
      ]
    }
  },
  "track_scores": true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...