Elasticsearch: найдите 10 лучших документов, когда 1 документ соответствует критериям - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть индекс с более чем 30 млн документов. Каждый документ имеет поле parentId и поле createOn. Модифицированные документы имеют поле Modified On. Даты хранятся как epoch_millis. Мне нужно найти 10 самых последних документов по parentId, если хотя бы один из «дочерних» документов был создан / изменен в пределах диапазона дат. Я пытался использовать составную агрегацию, но это займет слишком много времени.

{
    "aggregations": {
        "lists": {
            "composite": {
                "sources": [
                    {
                        "parentId": {
                            "terms": {
                                "field": "parentId"
                            }
                        }
                    }
                ],
                "size": 10000
            },
            "aggregations": {
                "most_recent": {
                    "max": {
                        "script": {
                            "source": "doc['modifiedOn'].size() == 0 || doc['modifiedOn'].value.millis == null ? doc['createdOn'].value.millis : doc['modifiedOn'].value.millis"
                        }
                    }
                },
                "most_recent_filter": {
                    "bucket_selector": {
                        "buckets_path": {
                            "modified_on": "most_recent"
                        },
                        "script": "params.modified_on >= 1552003847225L"
                    }
                },
                "top_items": {
                    "top_hits": {
                        "_source": [                            
                            "parentId",
                            "otherFields",                 
                            "createdOn",
                            "modifiedOn"
                        ],
                        "sort": {
                            "_script": {
                                "type": "number",
                                "script": {
                                    "source": "doc['modifiedOn'].size() == 0 || doc['modifiedOn'].value.millis == null ? doc['createdOn'].value.millis : doc['modifiedOn'].value.millis"
                                },
                                "order": "desc",
                                "mode": "max"
                            }
                        },
                        "size": 10
                    }
                }
            }
        }
    },
    "size": 0
}

Есть ли лучший способ сделать это?

...