2017-06-14 67 views
0

我想让我的用户在我的Firebase实时数据库中搜索一些内容。问题是,Firebase查询只允许我使用endAt()和startAt()搜索/过滤结果。例如让我们说我的用户搜索“rro”,那么我的搜索视图应该生成建议为“箭头”(在查看我的数据库后,如果它找到箭头输入)。如何在Firebase实时数据库Android中实现.contains(SomeText)的等效功能?

我能够在searchview中提出建议,但问题是.startAt()和.endAt()如果提供了“rro”,则无法实现/或找到任何内容。我想过滤器.contains();

如何在Firebase for Android中实现此目标?

+0

Firebase数据库不是全文搜索引擎。如果你需要这样的功能,你必须为此添加另一个组件。看看加藤的答案在这里的一个选项:https://stackoverflow.com/questions/22506531/how-to-perform-sql-like-operation-on-firebase –

+0

我不想使用Firebase云功能,因为我目前对node.js没有很好的了解。有没有其他的出路。有效且快速的 – coder3101

+0

它需要一个外部文本搜索引擎。也许别人知道更容易的选择,但这不太可能(这个问题经常被问到,我链接的是事实上的答案)。 –

回答

0

从数据库中获得的数据,并在客户端(应用程序)的过滤器一样this

+0

难道你不认为这会在网络上很沉重,因为可能有在生产中查看/获取数百万个内容的情况。 – coder3101

+0

您只能获取搜索关键字,您可以让API执行搜索并将其发送到您的应用程序,最简单快捷的方式是客户端 –

+0

其实,关键本身就是我需要获取以产生建议的东西(键是标题),它们的值是到同一数据库的URL,当我需要时加载搜索结果的内容.. – coder3101

0

制作结构这样

- 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()在可搜索的位置添加条目。另外,当箭头更改名称时,您必须以可搜索的方式进行更新,并且我建议将全部转换为小写,包括搜索文本和可搜索的对象名称。

+0

这不是我想要的,我有一个类似于这个结构,有一个节点叫可以使用键作为标题和值作为网址进行搜索。这将使可搜索节点充满了许多密钥,我不希望这样..我需要优化和尽可能有效... 标题将由最终用户生成,所以他/她可能会给一个标题“国王和王子”,那么这个音符就会有这么多的关键字(大约是17Combination3),这将是无效的,并将占据我的数据库沉重.. – coder3101