如何在Firebase数据库中进行简单的字符串搜索?

Zig*_*rve 31 android firebase firebase-realtime-database

我想在我的应用程序中创建一个简单的搜索,但在关于它的互联网上找不到任何东西,这比2014年更新.必须有更好的方法.有startAt和endAt函数,但它们不能按预期工作,并且区分大小写.你们是如何解决这个问题的?2016年该功能如何仍然不存在?

Fra*_*sco 111

在我的情况下,我能够通过以下方式部分实现SQL LIKE:

databaseReference.orderByChild('_searchLastName')
                 .startAt(queryText)
                 .endAt(queryText+"\uf8ff")
Run Code Online (Sandbox Code Playgroud)

\uf8ff查询中使用的字符是Unicode范围内的一个非常高的代码点(它是私有使用区[PUA]代码).因为它在Unicode之后的大多数常规字符之后,所以查询匹配以所有开头的值queryText.

通过这种方式,通过"Fre"搜索,我可以_searchLastName从数据库中获取具有"Fred,Freddy,Frey"作为属性值的记录.

  • 我怎样才能得到结果**Fred,Freddy,Frey**用搜索键:**re**? (4认同)
  • 那是不可能的.上面的解决方案提供了"Starts With"功能,但它不允许像SQL Server一样进行全文搜索.你需要全文功能,然后你必须实现弹性搜索的解决方案. (4认同)
  • 这很有效,至少对于起始字符串.但是在字符串中搜索仍然是firebase的一个基本问题.我认为在firebase核心本身应用基于正则表达式的搜索并且只是通过数据库参考接口公开功能应该不是什么大问题. (4认同)
  • startAt()还不够吗?文档说`startAt()`返回值大于或等于给定节点的所有节点。这里的“ endAt()”的作用是什么? (2认同)
  • 这是官方记录的:https://firebase.google.com/docs/database/rest/retrieve-data#range-queries (2认同)

小智 7

最后我明白了,您可以使用 where 子句来获取结果,例如SQL LIKE关键字like%%like 语法:

Firestore.collection(collectionName).orderBy(field).where(field, ">=", keyword.toUpperCase()).where(field, "<=", keyword.toUpperCase() + "\uf8ff").get() 
Run Code Online (Sandbox Code Playgroud)


小智 6

创建两个字符串变量

    searchInputToLower = inputText.getText().toString().toLowerCase();

    searchInputTOUpper = inputText.getText().toString().toUpperCase();
Run Code Online (Sandbox Code Playgroud)

然后在查询中将其设置为:

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Products");//Your firebase node you want to search inside..

    FirebaseRecyclerOptions<Products> options =
            new FirebaseRecyclerOptions.Builder<Products>()//the Products is a class that get and set Strings from Firebase Database.
            .setQuery(reference.orderByChild("name").startAt(searchInputUpper).endAt(searchInputLower + "\uf8ff"),Products.class)
            .build();
Run Code Online (Sandbox Code Playgroud)

“名称”是产品主节点内的节点。

.startAt(searchInputUpper) & .endAt(searchInputLower + "\uf8ff") 使搜索包含在您获得的 inputText.getText() 中输入的所有字符。