Агрегация Elasticsearch с использованием поля top_hits с упорядочением скриптов

У меня есть набор документов с src, txt а также flt поля. Я хочу запросить по txt поле следующим образом:

  1. Группировать (вешать) по src;
  2. В каждом ведре рассчитывают 1 верхний наиболее актуальный документ;
  3. Заказать каждое ведро по _score * doc.flt значение.

До сих пор я реализовал 1 и 2, но не 3. Даже если 3 может быть не очень эффективным, я все еще хочу иметь такую ​​опцию. Мой запрос выглядит так:

{
    "query" : {
        'match' : {
            'text' : {
                'query' : <some text>,
                'fuzziness' : 'AUTO',
                'operator' : 'and'
            }
        }
    },
    "aggs": {
        "by_src": {
            "terms": {
                "field": "src",
                "size" : 10,
                "order" : {"top_score" : "desc"}
            },
            "aggs": {
                "top_hits" : {
                    "top_hits" : {
                        "sort": { "_score": {  "order": "desc" } },
                        "size" : 1
                    }
                },
                "top_score": {
                    "max" : {
                        "script" : "_score",
                    }
                }
            }
        }
    }
}

1 ответ

Я считаю, что это не помогает, потому что вам не нужно использовать _source поле, чтобы применить сортировку к каждому сегменту, просто примените сортировку по имени поля:

{
  "query" : {
    'match' : {
        'text' : {
            'query' : <some text>,
            'fuzziness' : 'AUTO',
            'operator' : 'and'
        }
    }
},
"aggs": {
    "by_src": {
        "terms": {
            "field": "src",
            "size" : 10,
            "order" : {"top_score" : "desc"}
        },
        "aggs": {
            "top_hits" : {
                "top_hits" : {
                    "sort":[{
                        "flt": {"order": "desc"}
                    }],
                    "size" : 1
                }
            },
            "top_score": {
                "max" : {
                    "script" : "_score",
                }
            }
        }
    }
  }
}

Я предполагаю, что в вашем документе есть поле с именем flt что вы хотите использовать для сортировки. Естественно, вы также можете изменить сортировку на asc если это то, что вам нужно.

Другие вопросы по тегам