Я использую безболезненный скрипт для оценки документа в запросе bool.Мне нужно по-разному оценивать каждое условие "must" в запросе bool.
Поэтому у меня есть два варианта:
- Я завершаю каждый запрос must в script_score, чтобы я мог использоватьотдельный скрипт для каждого подзапроса
- Я заключаю весь запрос bool в счет скрипта, поэтому мне нужно использовать уникальный скрипт.Это значит, что я должен дать этому сценарию в качестве параметра желаемый тип оценки и добавить предложения if в сценарии
Вариант 1 будет выглядеть следующим образом:
GET /_search
{
"source": {
"query": {
"script_score": {
"query": {
"bool": {
"must": [
{*subquery1_here*},
{*subquery2_here*}
]
}
},
"script": {
"id": "universal_script",
"params": {
"query": ["{{subquery1-params}}", "{{subquery2-params}}"],
"score-type": ["{{subquery1-score_type}}", "{{subquery2-score_type}}"]
}
}
}
}
}
}
Параметр2 выглядело бы так:
GET /_search
{
"source": {
"query": {
"bool": {
"must": [
{
"script_score": {
"query": {*field1_subquery_here*}
},
"script": {
"id": "script-1",
"params": {
"query": "{{subquery1-params}}"
}
}
}
},
{
"script_score": {
"query": {*field2_subquery_here*}
},
"script": {
"id": "script-2",
"params": {
"query": "{{subquery2-params}}"
}
}
}
}
]
}
}
}
}
Я бы предпочел вариант 2, но мне интересно, стоит ли он больше вычислительной мощности?
Я боюсь, что вариант 2 заключается в том, что Elastic будет запускать каждый script_score независимо изабить все совпадения по заданному сценарию.Затем запустит запрос bool и получит только тот документ, который соответствует обоим подзапросам.Это было бы плохо, потому что скрипт для скоринга выполнялся бы на гораздо большем количестве документов, чем с опцией 1.
Так вот почему мне интересно, когда вычисляется оценка в запросе bool?