#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. Неплохо. Эй, я пишу руководство, полное подобных решений. Вы можете присоединиться к списку ожидания и сообщить мне, о чем еще вы хотели бы узнать.