ElasticSearch: как сгруппировать уникальные статистические записи с перекрывающимися полями (учетная запись и отпечаток пальца)? - PullRequest
0 голосов
/ 03 августа 2020

Есть индекс с полями:

  • account_id
  • fingerprint
  • et c.

Каждая запись может или может не иметь account_id , то же самое с отпечатком пальца . Их необходимо сгруппировать по account_id , попутно добавляя к этим учетным записям - записи с fingerprint , которые присутствуют в записях из указанного c account_id .

Суть задачи - вывести список уникальных записей статистики для известных учетных записей (те, у кого есть account_id + те, у кого его нет, но имеют тот же отпечаток, что и некоторые из записи в этой группе) и неизвестно (те, у кого есть только отпечаток пальца) с разбивкой на страницы.

Пробую так:

            'aggs' => [
            "items" => [
                "composite" => [
                    "sources" => [ 
                        [
                            'account_id' => [
                                'terms' => [ 'field' => 'account_id' ],
                            ],
                        ], [
                            'fingerprint' => [
                                'terms' => [ 'field' => 'fingerprint' ],
                            ],
                        ]
                    ],
                ],
                "aggs" => [
                    "hits" => [
                        "top_hits" => [
                            "size" => 100
                        ]
                    ]
                ]

            ],
            
        ]

И примерно так (вот знаю, что код не совсем правильный, только что нашел в истории) :

'collapse' => [
            'field' => 'account_id',
            'inner_hits' => [ [
                'name' => 'accounts',
                'size' => 1,
                'sort' => [ [ 'timestamp' => 'desc' ] ]
            ],
            [
                'name' => 'fingerprints',
                'size' => 1,
                'sort' => [ [ 'timestamp' => 'desc' ] ]
            ] ],
            "max_concurrent_group_searches" => 4 
        ],
...