【问题标题】:How can I achieve equivalent of .contains(SomeText) in Firebase Real time Database Android?如何在 Firebase 实时数据库 Android 中实现等效的 .contains(Some Text)?
【发布时间】:2017-11-16 12:42:10
【问题描述】:

我想让我的用户在我的 Firebase 实时数据库中搜索一些内容。问题是 Firebase Query 只允许我使用 endAt() 和 startAt() 搜索/过滤结果。例如假设我的用户搜索“rro”,那么我的搜索视图应该生成建议为“箭头”(在查看我的数据库后,如果它找到带有箭头的条目)。

我自己可以在 searchview 中提出建议,但问题是 .startAt() 和 .endAt() 如果提供了“rro”,则无法实现/或找到任何东西。我想要像 .contains(); 之类的过滤器

如何在 Firebase for Android 中实现这一点?

【问题讨论】:

  • Firebase 数据库不是全文搜索引擎。如果您需要此类功能,则必须为此添加另一个组件。在这里查看加藤的答案以获得一个选项:stackoverflow.com/questions/22506531/…
  • 我不想使用 Firebase 云功能,因为我目前对 node.js 不太了解。有没有其他的出路。一个有效和快速的
  • 它需要一个外部文本搜索引擎。也许其他人知道一个更简单的选择,但不太可能(这个问题经常被问到,我链接的是事实上的答案)。

标签: android firebase firebase-realtime-database


【解决方案1】:

对于这种不需要创建特殊结构的情况,我找到了更好的答案:

FirebaseDatabase.getInstance().getReference("users").orderByChild("LastName").startAt(queryText).endAt(queryText+"\uf8ff");

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

这样,通过“Fre”搜索我可以得到具有“Fred, Freddy, Frey”作为数据库中 LastName 属性中的值。

最初的答案是 Rizwan Khan。 链接:https://www.quora.com/How-would-you-search-a-Firebase-Realtime-Database-with-a-substring

【讨论】:

  • 塞尔吉奥,感谢您的回答。没关系,但是当您引用任何链接时,请分享链接
  • @YuriyTsarkov 对不起,不知道是否可以发布到另一个页面的链接,我会添加它。
  • 如何使用“Fre”作为搜索词来查找“Walder Frey”?还是“疯狂弗雷迪戴蓝眼镜”?谢谢
【解决方案2】:

制作这样的结构

- objects
  - UID1:Arrow
  - UID2:Rowboat
  - UID3:Bow
- searchable
  - arrow
    - UID1
  - rrow
    - UID1
  - row
    - UID1
    - UID2
  - ow
    - UID1
    - UID2
    - UID3
  - w
    - UID1
    - UID2
    - UID3
  - rowboat
    - UID2
  - owboat
    - UID2
  - wboat
    - UID2
  - boat
    - UID2
  - oat
    - UID2
  - oa
    - UID2
  - a
    - UID1
    - UID2
  - bow
    -UID3

然后它很容易搜索,只需使用类似的查询

FirebaseDatabase.getInstance().getReference().child("searchable").orderByKey().startAt(input).endAt(input+"~");

当您创建像箭头这样的对象时,您必须使用 .updateChildren() 在其中添加可搜索的条目。此外,当箭头更改名称时,您也必须在可搜索中进行更新,我建议您将搜索文本和可搜索对象名称全部转换为小写。

【讨论】:

  • 这不是我想要的,我有一个与此类似的结构,并且有一个名为 searchable 的节点,其中键作为标题,值作为正文的 url。这将使可搜索节点充满许多键,我不希望这样..我需要优化并且尽可能有效...标题将由最终用户生成,因此他/她可能会给出类似“国王和王子”,那么这个笔记会有很多键..(大约 17Combination3)这将是无效的,并且会占用我的数据库。..
  • 这将是一个真正的解决方法,但前提是您有几条记录,并且正如您在示例中看到的那样,您只有 3 个 UID,而且是您开始使用的记录的 10 倍以上.如果您有 1000 或 100.000 个 UID,该怎么办?此解决方案不可行。
猜你喜欢
  • 2021-02-05
  • 2019-02-08
  • 2016-11-28
  • 2017-06-03
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多