Упорядочить результаты запроса по пользовательской оценке, определенной в агрегировании

У меня есть куча таких объектов:

{
  "id": "12dfb835-6a0c-4047-ab51-d4e34116478e"
  "foo": "bar"
}

{
  "id": "3297b9d2-e05c-4874-91e4-c5b11e8e38c2"
  "foo": "bar"
}

У меня также есть следующий запрос. Он в основном группирует документы по id, а затем вычисляет оценку на основе сценария.

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ]
    }
  },
  "aggs": {
    "userID": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "my-awesome-score": {
          "scripted_metric": {
            "init_script": "state.scores = []",
            "map_script": "state.scores.add(42)",
            "combine_script": "double score = 0; for (s in state.scores) { score += s } return score",
            "reduce_script": "double score = 0; for (a in states) { score += a } return score"
          }
        }
      }
    }
  }
}

Это возвращает такие результаты:

 "buckets" : [
        {
          "key" : "12dfb835-6a0c-4047-ab51-d4e34116478e",
          "doc_count" : 1,
          "my-awesome-score" : {
            "value" : 42.0
          }
        },
        {
          "key" : "3297b9d2-e05c-4874-91e4-c5b11e8e38c2",
          "doc_count" : 1,
          "my-awesome-score" : {
            "value" : 42.0
          }
        }
        ]

Однако в hits результата моего запроса все мои документы имеют значение _score по умолчанию, равное 1. Как заставить Elastic использовать my-awesome-score в качестве значения _score для моих обращений и сортировать по этому показателю?

0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

API агрегации отделен от API совпадений/поиска, поэтому результат агрегации нельзя использовать для влияния на оценки или сортировки, возвращаемые вместе с попаданиями.

Вы можете применить сортировку на основе сценариев, но главный вывод здесь заключается в том, что оценка ограничивается одним обращением и, в отличие от агрегации метрик с помощью сценариев, упомянутой в вашем фрагменте, никогда не будет иметь доступа к атрибутам других документов. Другими словами, ваш сценарий может генерировать оценку только для документа, через который он проходит в данный момент, независимо от других документов.

Спасибо, Джо, думаю, я собираюсь немного поколдовать на C#, чтобы потом отсортировать результаты.

yesman 11.12.2020 16:13

Всем добра, удачи в волшебстве 🤙🏻

Joe - ElasticsearchBook.com 11.12.2020 16:29

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