Elasticsearch: эффективная сортировка по вложенным значениям - PullRequest
0 голосов
/ 02 января 2019

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

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

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

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

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

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

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

Теперь к вопросу: как я могу решить эту проблему более эффективно? Я иду по этому пути совсем неправильно, или есть способ не использовать 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 Ответ

0 голосов
/ 04 января 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...