Я сортирую результаты Elasticsearch (5.1.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
},
...
}