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

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

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

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

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

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

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

  1. зацикливание всех вложенных элементов (их много на один документ и много документов)
  2. я использую params['_source'], которая имеет репутацию замедления вещей. AFAIK, я должен использовать 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
  },
  ...
}

1 ответ

Решение

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

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

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

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