Firestore数据库查询,忽略大小写(不区分大小写)和like子句。

时间:2018-04-24 15:31:01

标签: firebase firebase-realtime-database google-cloud-firestore

基本上我在Firestore文档字段上编写搜索功能。我想写下面的SQL等价物。我找不到解决办法。

SELECT * 来自员工 WHERE lower(employee_name)LIKE'%johny%';

4 个答案:

答案 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)。

https://firebase.google.com/docs/firestore/solutions/search

答案 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")