У меня есть куча таких объектов:
{
"id": "12dfb835-6a0c-4047-ab51-d4e34116478e"
"foo": "bar"
}
{
"id": "3297b9d2-e05c-4874-91e4-c5b11e8e38c2"
"foo": "bar"
}
У меня также есть следующий запрос. Он в основном группирует документы по id
, а затем вычисляет оценку на основе сценария.
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
]
}
},
"aggs": {
"userID": {
"terms": {
"field": "id"
},
"aggs": {
"my-awesome-score": {
"scripted_metric": {
"init_script": "state.scores = []",
"map_script": "state.scores.add(42)",
"combine_script": "double score = 0; for (s in state.scores) { score += s } return score",
"reduce_script": "double score = 0; for (a in states) { score += a } return score"
}
}
}
}
}
}
Это возвращает такие результаты:
"buckets" : [
{
"key" : "12dfb835-6a0c-4047-ab51-d4e34116478e",
"doc_count" : 1,
"my-awesome-score" : {
"value" : 42.0
}
},
{
"key" : "3297b9d2-e05c-4874-91e4-c5b11e8e38c2",
"doc_count" : 1,
"my-awesome-score" : {
"value" : 42.0
}
}
]
Однако в hits
результата моего запроса все мои документы имеют значение _score
по умолчанию, равное 1. Как заставить Elastic использовать my-awesome-score
в качестве значения _score
для моих обращений и сортировать по этому показателю?
API агрегации отделен от API совпадений/поиска, поэтому результат агрегации нельзя использовать для влияния на оценки или сортировки, возвращаемые вместе с попаданиями.
Вы можете применить сортировку на основе сценариев, но главный вывод здесь заключается в том, что оценка ограничивается одним обращением и, в отличие от агрегации метрик с помощью сценариев, упомянутой в вашем фрагменте, никогда не будет иметь доступа к атрибутам других документов. Другими словами, ваш сценарий может генерировать оценку только для документа, через который он проходит в данный момент, независимо от других документов.
Всем добра, удачи в волшебстве 🤙🏻
Спасибо, Джо, думаю, я собираюсь немного поколдовать на C#, чтобы потом отсортировать результаты.