【发布时间】:2019-10-17 11:30:44
【问题描述】:
我知道 Firestore 不支持全文搜索,它为我们提供了使用第三方服务的解决方案。但是,我找到了simple“全文搜索”的简单解决方案,我认为这可能会帮助其他不想像我一样使用第三方服务来完成如此简单任务的人。 我正在尝试搜索保存在我的 companyName 下的 firestore 集合中的公司名称,该名称可以是任何格式,例如“My Awesome Company”。当使用 companyName 添加新公司或更新 companyName 中的值时,我还保存了 searchName ,它与公司名称的值相同,但小写没有空格
searchName: removeSpace(companyName).toLowerCase()
removeSpace 是我的简单自定义函数,可以删除文本中的所有空格
export const removeSpace = (string) => {
return string.replace(/\s/g, '');
}
这会将我们的公司名称变为 myawesomecompany,并保存在 searchName
中现在我有了一个 firestore 函数来搜索通过 searchName 建立索引并返回 companyName 的公司。最小搜索值是没有最后一个字符的搜索值,最大搜索值是添加了“zzzzzzzzzzzzzzzzzzzzzzzz”转换为小写的搜索值。这意味着如果您搜索 My Aw,那么最小值将是 mya,最大值将是 myawzzzzzzzzzzzzzzzzzzzzzzz
exports.handler = ((data) => {
const searchValue = data.value.replace(/\s/g, '').toLowerCase()
const minName = searchValue.substr(0, searchName.length-1)
const maxName = searchValue + "zzzzzzzzzzzzzzzzzzzzzzzz"
let list = []
const newRef = db.collection("user").where("profile.searchName", ">=", minName).where("profile.searchName", "<=", maxName)
return newRef.get()
.then(querySnapshot => {
querySnapshot.forEach(doc => {
list.push({ name: doc.data().profile.companyName})
})
return list
})
})
我没有时间对其进行全面测试,但到目前为止它可以正常工作。如果您发现它有任何问题,请告诉我。现在的问题是
“z”字符是firestore中的最高值字符,还是有其他更体面的方法可以在不添加“zzzzzzzzzzzzz”的情况下添加到搜索值最大值?
【问题讨论】:
-
经过一些测试,我发现这种方法不太可靠。我建议使用下面的数组选项
标签: reactjs google-cloud-firestore google-cloud-functions