Elasticsearch манипулирует _score при выводе функции

#elasticsearch

#elasticsearch

Вопрос:

У меня есть следующий пример JSON

 [{"field_1" "abc",
 "field_2": 2
 "field_3" "some more text"
},
{"field_1" "xyz",
 "field_2": 4
 "field_3" "some more text"
}]
 

Я написал свой пользовательский скрипт для вывода в соответствии со значением field_2

 "if {(doc['field_2'] < 3) { return 1.2;} else if if {(doc['field_2'] < 5) { return 1.4;} else {return 1;}"
 

Теперь я хотел умножить _score на возвращаемый результат моего скрипта.

 GET my_index/_search?
{
   "query":{
      "bool":{"Must"{....}
            }
   },
    "_source":"*",
   ,{"script_field":{
          "scrore_factor":{
                     "script":{
                            "lang":"painless",
                             "source":"""if {(doc['field_2'] < 3) { return 1.2;} else if if {(doc['field_2'] < 5) { return 1.4;} else {return 1;}"""
                     }
           } 
    }
}
  
 

Как я могу этого добиться? Я попытался умножить на _score, но он не анализирует мой запрос

Ответ №1:

_score недоступен внутри script_fields .

Однако вы можете использовать function_score запрос. Ваш пример, если он полон синтаксических опечаток, плюс field в вашем примере нет атрибута, вызываемого, поэтому я беру единственное числовое поле — field2 :

 POST my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "function_score": {
            "query": {
              "match_all": {}
            },
            "functions": [
              {
                "script_score": {
                  "script": "def factor; if (doc['field_2'].value < 3) { factor = 1.2; } else if (doc['field_2'].value < 5) { factor = 1.4 } else { factor = 1 } return _score * factor"
                }
              }
            ]
          }
        }
      ]
    }
  }
} 
 

Комментарии:

1. Спасибо, Джо, за твой ответ. [также отредактировал мои опечатки] Запрос сработал для меня. Одна вещь, которую я не получил, — это когда я сравнил результат с измененным сценарием как «_score * 1», я ожидал, что оценка увеличится / уменьшится в «раз» раз. но это не так. Есть ли какая-либо причина для этого? С уважением Rachana J

2. Пожалуйста. Не уверен, что вы имеете в виду — можете ли вы поделиться полным запросом / запросами и точно указать, где, по вашему мнению, запрос не выполняется?

3. Спасибо, Джо, изменил мой вложенный запрос и начал работать отлично.

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