Агрегирование на основе атрибута ObjectField, затем сортировка Nested Fields - PullRequest
0 голосов
/ 25 июня 2019

Допустим, у меня есть такие документы -

{
    "_id": 1,
    "threat": {
        "application_number": 1234,
    }
    "score_algorithms": [
        {
            "score": 21,
        },
        {
            "score": 93,
        }    
    ],
    "max_similarity": 93,
}

{
    "_id": 2,
    "threat": {
        "application_number": 1348,
    }
    "score_algorithms": [
        {
            "score": 45,
        },
        {
            "score": 67,
        }    
    ],
    "max_similarity": 67,
}

{
    "_id": 3,
    "threat": {
        "application_number": 1234,
    }
    "score_algorithms": [
        {
            "score": 98,
        },
        {
            "score": 51,
        }    
    ],
    "max_similarity": 98,
}

Теперь повестка дня здесь -

  • Сортировка этих документов по атрибуту максимального сходства max_similarity

  • Затем агрегируйте документы в соответствии с threat.application_number

  • Например, для первого полученного результата должна быть группировка всех документов, где threat.application_number равно 1234 (максимальное значение max_similarity).Второй записью будет группировка всех документов, где threat.application_number равно 1348 и т. Д. И т. Д.
  • Все документы должны иметь внутренние отсортированные значения score_algorithms.

1 Ответ

1 голос
/ 25 июня 2019

Для требований 1. и 2. т. Е. Для получения документов, сгруппированных и отсортированных, вы можете использовать параметр order в определении агрегации.

Для извлечения поля score_algorithmsв агрегации используйте субагрегацию top_hits.

Вы сможете получить документы только до параметра size агрегации top_hits.Если у вас есть большое количество документов для одного application_number, это может быть медленным.

{
    "size": 0,
    "aggs" : {
        "applications" : {
            "terms" : {
                "field" : "threat.application_number",
                "order": [{"stats.max": "desc"}]
            },
            "aggs" : {
                "stats" : { "stats" : { "field" : "max_similarity" } },
                "applications_fields": {
                    "top_hits": {
                        "sort": [
                            {
                                "max_similarity": {
                                    "order": "desc"
                                }
                            }
                        ],
                        "_source": {
                            "includes": [ "score_algorithms", "max_similarity" ]
                        },
                        "size" : 100
                    }
                }
            }
        }

    }
}
...