Я использую ElasticSearch для хранения списков. Пользователь может сортировать по нескольким полям (например, grossReturn, buyPrice) и т. Д.
Теперь мы хотим предложить опцию, чтобы пользователь мог хранить избранные списки.
Сохраняю избранное в PostgresSQL. Затем перед каждым запросом я получаю избранное от Postgres - помещаю их в массив и создаю поле со сценарием, например:
const scripts = {
favorite: {
script: {
source: 'return params.favorites.contains(params._source.id) ? 1 : 0',
params: {
favorites,
},
},
},
};
Теперь я также хочу отсортировать по этому полю, и это проблема:
const getSortParams = (sortBy, scripts) => {
const sort = {};
if (sortBy) {
const fieldName = sortBy.split(',')[0];
const sortOrder = sortBy.split(',')[1];
if (fieldName === 'favorite') {
sort._script = {
type: 'number',
script: scripts[fieldName].script,
order: sortOrder,
};
} else {
sort[fieldName] = {
order: sortOrder,
};
}
}
return sort;
};
Это очень очень медленно - сортировка занимает примерно 3 с. Это имеет смысл, так как все должно быть рассчитано.
Мой вопрос будет -> как лучше это сделать?