gpt4 book ai didi

javascript - Firestore 用例 : can't search by hashtags and newest first

转载 作者:行者123 更新时间:2023-12-01 17:25:44 24 4
gpt4 key购买 nike

如何创建具有动态更改字段(例如主题标签)和排序的复合查询?

设置

我正在使用 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, createdAt] 的索引对下一个查询没有用。

问题

如何创建具有动态更改字段和排序的复合查询?

想法

  • 基于用户输入的查询很常见,尤其是带有主题标签的查询
  • 不应下载完整的结果集,因此需要分页
  • 显示最新的结果也是一个常见的需求

是否有更好的方法来处理使最新优先查询成为可能的主题标签?

是否有第 3 方服务可以帮助解决这个问题? Algolia 似乎只做全文搜索。 Elastic 文档很难确定它是否支持此用例。

另一个想法可能是拥有一个带有主题标签排列的数组属性,例如

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

那么这个属性就可以被索引了。根据 firestore 限制,只需要一个“数组包含”子句。但这会导致一些 ~ 2^n 个问题。

谢谢!

最佳答案

Firestore inarray-contains 查询现在支持这一点,您可以找到更多详细信息 here .

关于javascript - Firestore 用例 : can't search by hashtags and newest first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52835330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com