基本上我在Firestore文档字段上编写搜索功能。我想写下面的SQL等价物。我找不到解决办法。
SELECT * 来自员工 WHERE lower(employee_name)LIKE'%johny%';
答案 0 :(得分:3)
没有类似的运营商。查看所有可用的运营商:https://firebase.google.com/docs/firestore/query-data/queries 该页面还包含查询数据库的不同方法。
对于不区分大小写的排序/查询,请参阅Cloud Firestore Case Insensitive Sorting Using Query
上的答案它基本上建议将小写数据存储在附加字段中。
答案 1 :(得分:1)
正如诺曼已经写过的那样,Firebase中没有LIKE运算符。
我写了answer in SO,解释了如何实现类似的查询(即使它是 StartWith 搜索,而不是全文搜索):
source = ColumnDataSource(df)
p = figure()
r = p.circle(x='Polarity', y='Subjectivity',
source = source)
select = Select(title="Subject", options=['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'd10', 'd11'])
def update_plot(attr, old, new):
if select.value == 'd1':
newSource = d1
if select.value == 'd2':
newSource = d2
if select.value == 'd3':
newSource = d3
if select.value == 'd4':
newSource = d4
if select.value == 'd5':
newSource = d5
if select.value == 'd6':
newSource = d6
if select.value == 'd7':
newSource = d7
if select.value == 'd8':
newSource = d8
if select.value == 'd9':
newSource = d9
if select.value == 'd10':
newSource = d10
if select.value == 'd11':
newSource = d11
source.data = newSource
select.on_change('value', update_plot)
layout = column(row(select, width=400), p)
curdoc().add_root(layout)
如果您需要更高级的搜索方式,那么建议使用ElasticSearch作为可能的解决方案。
答案 2 :(得分:1)
Cloud Firestore不支持本机索引编制或在文档中搜索文本字段。此外,下载整个集合以在客户端搜索字段是不切实际的。要启用Cloud Firestore数据的全文本搜索,请使用第三方搜索服务(例如Algolia)。
答案 3 :(得分:0)
可能是在另一篇文章的错误主题下回答了此问题,但请查看我的回答here
到目前为止,该解决方案对我仍然有效,但是我将名字分为姓和名。 然后,“按开头”(LIKE search%)的逻辑就足够了,因为IMO人员通常开始键入名称的开头,而不是需要“包含”匹配项的东西(如“ LIKE%search%”)。
以防万一其他帖子由于错误的部分而被删除(如果可能的话),这是从Firestore客户角度来看的摘录:
from firebase_admin import firestore
users = db.collection("users")\
.order_by("last_name")\
.where("last_name", ">=", last_name.upper())\
.where("last_name", "<=", last_name.lower() + "\uf8ff")\
.stream()
编辑09-03-2020 。大多数时候,我似乎都没有问题,但是当我将其应用于另一个项目时,却得到了意想不到的结果。长话短说,您可能需要复制保存比较数据的方式。例如,您可能需要一个字段以所有大写形式保存last_name,另一个字段以所有小写形式保存它,然后更改第一个where子句以比较last_name_upper和第二个以比较last_name_lowercase。到目前为止,在我的第二个项目中,这似乎产生了更准确的结果,因此,如果先前的答案不能很好地起作用,您可能要尝试一下
编辑09-07-2020 从2020年9月3日开始的先前编辑部分准确。在匆忙思考的过程中,我已经完全解决了,我完全忘记了firebase不允许您在不同的字段中使用<,>,<=,> =。您可能需要执行两个查询并合并它们,但是您可能仍在阅读比您预期更多的文档。用适当的搜索词对较高或较低版本进行比较,似乎可以得到原始答案所期望的原始结果。例如:
.orderBy("last_name_upper")
.where("last_name_upper", ">=", this.searchForm.text.toUpperCase())
.where("last_name_upper", "<=", this.searchForm.text.toUpperCase() + "\uf8ff")