Как можно создать составной запрос с динамически изменяющимися полями (например, хэштегами) и упорядочением?
Настройка
Я использую 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 проблемам.
Спасибо!