【问题标题】:How to get search results quickly?如何快速获得搜索结果?
【发布时间】:2017-12-02 05:37:22
【问题描述】:

我在 firebase 数据库中有一个对象数据库,我需要一个函数来返回一些搜索结果;如果我收到一个字符串来搜索对象的“标题”方面的某个子字符串,我需要返回一个满足该条件的所有对象的列表。我目前正在详尽地进行,即检查每本书的字段并将其添加到列表中。

不幸的是,这种方法的速度很糟糕:随着列表变得越来越大,生成这个列表所花费的时间长得令人无法接受。然而,一个可接受的解决方案是一次返回一个对象,以便动态增长列表。我突然想到,正常的搜索功能似乎使用了这个,并且视频/音频缓冲也必须连续获取该数据。

但我不知道如何在 Java 和 Android 上实现这一点。我什至没有遇到类似的事情,但我确信有办法做到这一点。有什么建议吗?

**编辑:** 所以特别是,我有一个 Android 应用程序,我需要在其上编写一个函数供我的伙伴使用。此函数必须收集 Book 数据对象并返回它们。我目前在数据库中只有 32 本书,所以我认为我所经历的任何时间下沉都是由于从 firebase 获取数据。必须有某种方法一次将其归为一本结果书,以减少用户感知的等待时间,但我不知道如何处理这个问题。

【问题讨论】:

  • 您是否尝试过使用堆而不是列表?我认为顺序对你来说并不重要
  • @Meepo 嗯,没听说过。刚才查看了它们之后,我不太明白它们是什么,也不知道它们如何帮助我;是解释很快还是我在这里过头了?
  • 这就像一个列表,但索引是为了速度而完成的。因此,您可以在堆中快速存储和检索事物,但缺点是它们没有排序。由于从堆中添加和获取比列表快得多,因此我建议您尝试一下,尽管我不确定它是否有助于处理非常非常大量的数据。它的工作原理的解释有点复杂,但使用它应该很容易。假设您将 123、245 和 357 添加到堆中。如果堆的长度为 10 个整数,那么您存储的整数将存储在索引号 mod 10 处。沿着这些线的东西
  • 还请注意,我指的是数据结构,而不是您计算机的堆。您的搜索结果可能在谈论错误的事情。例如,优先级队列是一个堆:docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
  • 嗯,如果列表本身是问题,我认为这会起作用。不幸的是,我认为更大的时间消耗是从 Firebase 实际获取数据,除了在收集结果时返回结果之外,我无法真正看到如何优化。

标签: java android search firebase-realtime-database


【解决方案1】:

您可以使用 Firebase sdk 提供的 orderByChild 方法。这是一个示例代码:

  titlesDatabaseReference.orderByChild("title").equalTo("the title you search for").
              addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Do whatever you want with the snapshot
                                }
                            }
                        }
                    });

您还可以使用limitToFirst 和limitToLast 方法来限制搜索结果。

【讨论】:

  • 有没有一种方便的方法可以在可返回函数中使用它?我知道它是异步的,我对 Java 对 async 和 Promise 等的处理不太熟悉。
  • 您可以使用callBack接口,并在您想要的类(例如Main Activity)中实现它,然后在onDataChange方法中调用它。
  • 我的意思是这样的: public interface CreateAccountCallback { void onSearchDone(); }
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
相关资源
最近更新 更多