Как отсортировать набор полей по полю в результатах - PullRequest
1 голос
/ 15 мая 2019

Мне нужно отсортировать сегменты по полю «приоритет», определенному как текст, но я понятия не имею, как это сделать.

Вы не могли бы помочь мне с этим?

Я пробовал bucket_sort, но ES выдает ошибку о типе, то же самое с сортировкой и порядком.

это запрос агрегации

{
 "query": {
   [...]
  },
  "sort": [
    {
      "priority.keyword": {
        "order": "asc"
      }
    }
  ],
  "aggregations": {
    "by_family": {
      "terms": {
        "field": "familyId",
        "size": 25,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "same_family": {
          "top_hits": {
            "from": 0,
            "size": 1,
            "version": false,
            "explain": false,
            "highlight": {
              "pre_tags": [
                "<search>"
              ],
              "post_tags": [
                "</search>"
              ],
              "fields": {
                "title*": {
                  "type": "unified"
                }
                }
              }
            }
          }
        }
      }
    }
  }

пример результатов:

{
  "responses" : [
    {
      "took" : 13117,
      "timed_out" : false,
      "_shards" : {
        "total" : 10,
        "successful" : 10,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1754299,
        "max_score" : null,
        "hits" : [...]
      },
      "aggregations" : {
        "by_family" : {
          "doc_count_error_upper_bound" : 40,
          "sum_other_doc_count" : 1753462,
          "buckets" : [
            {
              "key" : 39031576,
              "doc_count" : 92,
              "same_family" : {
                "hits" : {
                  "total" : 92,
                  "max_score" : 10.636923,
                  "hits" : [
                    {
                      "_index" : "idx5-1554993721115",
                      "_type" : "_doc",
                      "_id" : "589403A-333506350",
                      "_score" : 10.636923,
                      "_source" : {
                        "number" : "589403A",
                        "suggest" : {
                          "input" : [
                            "589403A"
                          ]
                        },
                        "id" : "589403A-333506350",
                        "familyRepresentative" : 1,
                        "familyId" : 39031576,
                        "countryCode" : "NZ",
                        "number" : "589403",
                        "kind" : "A",
                        "family" : [ ],
                        "priority" : "20070425", <-------------
                        "created" : "2019-04-14",
                        "modified" : null,
                        "title" : [...],

Я хочу отсортировать агрегаты сегментов (asc / desc) по полю «приоритет», определенному как текст в индексе

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

давайте попробуем это для простоты:

'aggs' => [
    'by_family' => [
        'terms' => [
            'field' => 'familyId',
            'order' => [ '_term' => 'asc' ]
        ],
    ],
]

Сценарий выше сфокусируется на вашем поле familyId, затем вы можете изменить значение _term там на asc или desc изменить порядок соответственно

0 голосов
/ 15 мая 2019

Вам необходимо определить другую подгруппу (например, max или min в зависимости от того, как вы хотите отсортировать), а затем отсортировать родительскую агрегацию terms по этой метрике. Помните, что в ваших контейнерах по familyId все документы могут иметь разные значения для поля priority, поэтому не имеет смысла сортировать сегменты по данному полю документа, только по агрегированному значению этого данного поля .

{
 "query": {
   [...]
  },
  "sort": [
    {
      "priority.keyword": {
        "order": "asc"
      }
    }
  ],
  "aggregations": {
    "by_family": {
      "terms": {
        "field": "familyId",
        "size": 25,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "max_priority": "desc"
          }
        ]
      },
      "aggregations": {
        "max_priority": {
          "max": {
              "script": "Long.parseLong(doc['priority.keyword'].value)"
          }  
        }
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...