Как заметил Вэл, вы не можете получить доступ к _source
документам в запросах скрипта в последних версиях Elasticsearch.Ноasticsearch позволяет вам получить доступ к этому _source
в «контексте контекста».
Таким образом, возможный обходной путь (но вы должны быть осторожны с производительностью) - это использовать в своем запросе счетную оценку в сочетании с min_score.
Вы можете найти пример такого поведения в этой публикации переполнения стека Запросить документы по сумме значений вложенных полей вasticsearch .
В вашем случае такой запрос можетвыполните задание:
POST <your_index>/_search
{
"min_score": 0.1,
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": {
"source": """
if (params["_source"]["Employee"].length === params.nbEmployee) {
def firstEmployee = params._source["Employee"].get(0);
if (firstEmployee.Name == params.name) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
""",
"params": {
"nbEmployee": 3,
"name": "John"
}
}
}
}
]
}
}
}
В параметрах следует указать номер сотрудника и имя, чтобы избежать перекомпиляции сценария для каждого варианта использования этого сценария.
Но помните, что это может быть очень тяжелым для вашего кластера, как уже упоминал Val.Вы должны сузить набор документов, к которым вы будете применять скрипт, добавив фильтры в function_score query
(match_all в моем примере).И в любом случае это не тот способ, которым следует использовать Elasticsearch, и вы не можете ожидать ярких результатов при таком взломанном запросе.