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

Posted

技术标签:

【中文标题】Firestore 数据库查询,忽略大小写(不区分大小写)和 like 子句。 [复制]【英文标题】:Firestore database query, ignore case (case insenstive) and like clause. [duplicate] 【发布时间】:2018-10-04 22:41:42 【问题描述】:

基本上,我正在 Firestore 文档字段上编写搜索功能。我想写相当于下面的SQL。我没有找到继续进行的解决方案。

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

【问题讨论】:

【参考方案1】:

没有like 运算符。查看所有可用的运算符:https://firebase.google.com/docs/firestore/query-data/queries 该页面还包含查询数据库的不同方式。

对于不区分大小写的排序/查询,请参阅Cloud Firestore Case Insensitive Sorting Using Query的答案

它基本上建议将您的小写数据存储在附加字段中。

【讨论】:

我知道我必须存储一列 (employee_name_lowercase) ,但是我将如何管理 %john% 文本?我想在某个地方我必须使用 startAt 。但我无法完成我正在寻找的确切结果。 这是正确的答案,虽然可能不受欢迎。【参考方案2】:

正如 Norman 已经写过的,Firebase 中没有 LIKE 运算符。

我写了一个answer in SO,解释了如何实现类似的查询(即使是StartWith搜索,而不是全文搜索):

databaseReference.orderByChild('_searchLastName')
             .startAt(queryText)
             .endAt(queryText+"\uf8ff")
             .once("value")

如果您需要更高级的搜索方式,建议使用 ElasticSearch,作为一种可能的解决方案。

【讨论】:

【参考方案3】:

可能在另一篇帖子的错误主题下回答了这个问题,但请查看我的回答 here

到目前为止,该解决方案对我有效,但我将姓名分为名字和姓氏。 然后“开始于”(LIKE search%)逻辑就足够了,因为 IMO 人们通常开始输入名称的开头,而不是需要“包含”匹配的内容(LIKE %search%)。

以防万一其他帖子由于错误的部分而被删除(如果可能的话),这是从 firestore 客户端的角度来看的 sn-p:

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()

2020 年 9 月 3 日编辑 这似乎在部分时间内有效。大多数时候我似乎没有问题,但是当我将它应用到另一个项目时,我得到了意想不到的结果。长话短说,您可能需要复制保存要比较的数据的方式。例如,您可能需要有一个字段将 last_name 保存为全部大写,而另一个字段将其保存为全部小写,然后将第一个 where 子句更改为比较 last_name_upper 并将第二个子句更改为比较 last_name_lowercase。到目前为止,在我的第二个项目中,这似乎产生了更准确的结果,因此如果之前的答案效果不佳,您可能想尝试一下

2020 年 9 月 7 日编辑 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")

【讨论】:

【参考方案4】:

Cloud Firestore 不支持原生索引或搜索文档中的文本字段。此外,下载整个集合以在客户端搜索字段是不切实际的。要启用对 Cloud Firestore 数据的全文搜索,请使用 Algolia 等第三方搜索服务。

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

【讨论】:

以上是关于Firestore 数据库查询,忽略大小写(不区分大小写)和 like 子句。 [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore 查询是不是仍区分大小写?

mysql模糊查询区分大小写的问题~~

mysql数据查询分不分大小写

在oracle中怎样进行忽略大小写的查询

oracle 区别大小写吗

mysql模糊查询区分大小写