Сортировка collapse query по inner_hits doc count


(Griand) #1

Добрый день.

На данный момент для группировки документов по значению поля использую запрос с terms агрегированием и далее top_hits subaggregation для извлечения документа с top score значением. Такой запрос по известным причинам не позволяет выполнять пагинацию и поэтому приходится доставать все документы за раз даже если нужно отобразить только первые 10 документов.

В версии 5.3.0 появился Field Collapsing Search API, который делает то же что и terms aggs + top_hits subaggs и плюс к этому позволяет реализовать пагинацию, но встал вопрос с сортировкой по размеру inner_hits doc count. Мне нужно чтобы результаты запроса были отсортированы по убыванию по количеству inner_hits документов.

Весь вопрос сводится к тому как получить доступ к значению поля inner_hits.my_hits_name.hits.total, например при пересчете score значения.

GET /index_name/my_type/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "script_score": {
        "script": {
          "lang": "painless",
          "inline": "inner_hits.hits_by_key.hits"
        }
      }
    }
  },
  "collapse": {
    "field": "key",
    "inner_hits": {
      "name": "hits_by_key",
      "size": 1,
      "sort": [
        {
          "price": "asc"
        }
      ]
    }
  }
}

Тот же самый вопрос возникает если пытаться делать сортировку через script based sorting:

GET /index_name/my_type/_search
     {
      "collapse": {
        "field": "key",
        "inner_hits": {
          "name": "hits_by_key",
          "size": 1,
          "sort": [
            {
              "price": "asc"
            }
          ]
        }
      },
      "sort": {
        "_script": {
          "type": "number",
          "script": {
            "lang": "painless",
            "inline": "inner_hits.hits_by_key.hits"
          },
          "order": "desc"
        }
      }
    }

Возможно ли сортировать по inner_hits doc count в принципе или продолжать пользоваться аггрегированием?


(Igor Motov) #2

Поиск производится в несколько фаз. К тому времени, когда у нас есть информация о inner_hits.hits_by_key.hits, группы уже должны быть отсортированы. Другими словами, во время фазы сортировки информация по которой вы хотите сортировать еще не доступна - она будет получена только в следующей фазе. Поэтому то, что вы хотите, реализовать на данный момент невозможно.


(system) #3

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.