Сценарий использования Firestore: сначала нельзя искать по хэштегам и новейшим - PullRequest
0 голосов
/ 16 октября 2018

Как можно создать составной запрос с динамически изменяющимися полями (например, хэштегами) и упорядочением?

Настройка

Я использую Firestore для реализации следующего:

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

Следующая структура была создана для размещения хэштегов:

/items/{itemId}:
{
  name: "My favorite chair",
  createdAt: firebase.firestore.FieldValue.serverTimestamp(),
  hashtags: {
    wooden: true,
    red: true,
    small: true
  }
}

Изапрос для «маленьких», «красных» элементов выглядел бы так:

const userSuppliedKeywords = ['red', 'small'];
let ref = firebase.firestore().collection('items');
ref = userSuppliesKeywords.reduce(
  (acc, key) => acc.where(`hashtags.${key}`, '==', true)
  , ref
);
ref.orderBy('createdAt', 'desc').limit(20).get()....

Задача

Из-за использования orderBy Firestore требуется индекс для этого поиска.Но это нежизнеспособно, потому что индекс для [hashtag.red, hashtag.small, создалAt] бесполезен для следующего запроса.

Вопрос

Как можно создать составнойзапрос с динамически изменяющимися полями и порядком?

Мысли

  • Запросы, основанные на пользовательском вводе, являются общими, особенно с хэштегами
  • Не следует загружать полный набор результатов,так что нумерация страниц необходима
  • Отображение новейших результатов также является распространенным требованием

Может быть, есть лучший способ обработки хештегов, которые делают запросы с самыми новыми запросами?

Может быть сторонний сервис, чтобы помочь с этим?Алголия, кажется, делает только полнотекстовый поиск.Эластичная документация немного грубовата, чтобы определить, поддерживает ли она этот вариант использования.

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

['wooden', 'red', 'small', 'wooden-red', 'wooden-small', 'red-small',
 'wooden-red-small']

Тогда это свойствоможет быть проиндексирован.В соответствии с ограничениями пожарного хранилища требуется только одно условие «массив-содержащий».Но это приводит к ~ 2 ^ n проблемам.

Спасибо!

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