Смешивание пользовательских данных с ElasticSearch - PullRequest
0 голосов
/ 12 октября 2019

Я использую 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 с. Это имеет смысл, так как все должно быть рассчитано.

Мой вопрос будет -> как лучше это сделать?

1 Ответ

1 голос
/ 13 октября 2019

Добавьте свойство в свой класс определения листинга, которое будет указывать, является ли оно любимым или нет (true, false). Так как это для каждого пользователя, возможно, добавьте свойство массива для вашей модели пользователя, которое будет хранить массив идентификаторов избранных списков.

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