Elasticsearch: эффективная сортировка вложенных значений

Я сортирую результаты Elasticsearch (5.1.1) на основе вычисления значений во вложенных структурах ключ/значение.

Сортировка должна:

  1. найти значения из заданных ключей в нескольких вложенных структурах
  2. умножить эти значения друг на друга
  3. использовать это умножение в качестве оценки для сортировки

То, что у меня есть сейчас, работает, но очень медленно/неэффективно. Я сделал безболезненный сценарий из-за расчетов в № 2 выше. Что я делаю:

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

Я думаю, что неэффективность связана с:

  1. зацикливание на всех вложенных элементах (их много на документ и много документов)
  2. Я использую params['_source'], который, как известно, замедляет работу. Насколько я знаю, я должен использовать params['_source'] для обращения к вложенным значениям в Painless.

Теперь к вопросу: как я могу решить эту проблему более эффективно? Я делаю это совершенно неправильно, или есть способ не использовать params['_source']?

Мое сопоставление (вложенная структура "my_ratios"):

{
  "my_index": {
    "mappings": {
      "my_type": {
        "properties": {
          "a_value": {
            "type": "long"
          },
          "my_ratios": {
            "type": "nested",
            "properties": {
              "Key": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "Value": {
                "type": "float"
              }
            }
          }
        }
      }
    }
  }
}

Пример вложенной структуры ключ/значение:

{
  {
    "Key": "Key1",
    "Value": 0.4898
  },
  {
    "Key": "Key2",
    "Value": 0.14286
  },
  {
    "Key": "Key3",
    "Value": 6.12245
  },
  ...
}

person Scarabas    schedule 02.01.2019    source источник


Ответы (1)


Я боюсь, что ваш единственный вариант — либо реконструировать ваши данные, либо иметь копию соответствующих структур данных только для вашей сортировки.

Насколько я знаю, Elasticsearch никогда не предназначался для эффективной работы с params['_source'], и вам нужно, как вы указали, использовать это для доступа к вложенным объектам из Painless. Другими словами, Elasticsearch неэффективен при выполнении пользовательских операций над вложенными объектами.

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

person The_Torst    schedule 04.01.2019
comment
Проклятие. Спасибо. Я уже выхожу из циклов for, когда они находят то, что им нужно. - person Scarabas; 05.01.2019