【问题标题】:firebase: implementing pattern searching in firebasefirebase:在 firebase 中实现模式搜索
【发布时间】:2014-01-11 13:07:25
【问题描述】:

我知道 firebase 中没有 WHERE 子句。但是我们如何在 firebase 中实现模式搜索,就像在 SQL 中使用 LIKE 运算符一样。

我们如何在 firebase 中实现以下 sql 查询?

SELECT * FROM Customers WHERE City LIKE 's%';

【问题讨论】:

    标签: sql angularjs firebase


    【解决方案1】:

    理念

    一个接近的解决方案是在服务器端 NodeJS 脚本中创建由 City(或您想要搜索的任何其他字段)索引的数据索引。

    这将不完全复制LIKE 的行为,但是它将允许通过城市名称轻松查询,这可能会消除对这种行为的需要。

    节点脚本

    这通常通过一个用 NodeJS 编写的简单服务器端脚本来完成。想象一下您的用户数据存储在/users/data 中的场景。您的脚本将如下所示。

    var ref = new Firebase("<Your Firebase>.firebaseio.com");
    
    // A Firebase ref where all our users are stored
    var userDataRef = ref.child('users/data');
    
    // A Firebase ref which is where we store our index
    var byCityRef = ref.child("users/byCity");
    
    // Then bind to users/data so we can index each user as they're added
    userDataRef.on("child_added", function (snapshot) {
    
      // Load the user details
      var user = snapshot.val();
    
      // Use the snapshot name as an ID (i.e. /users/data/Tim has an ID of "Tim")
      var userID = snapshot.name();
    
      // Push the userID into users/byCity/{city}
      byCityRef.child(user.city).push(userID);
    
    });
    

    此脚本将创建如下结构:

    {
      "users": {
        "data": {
          "Tim": {"hair": "red", "eyes": "green", "city": "Chicago"} 
        },
        "byCity": {
          "Chicago": {
            "-asd09u12": "Tim"
          }
        }
      }
    }
    

    客户端脚本

    一旦我们为我们的数据建立了索引,查询它就很简单,只需两个简单的步骤即可完成。

    var ref = new Firebase("<Your Firebase>.firebaseio.com");
    var userDataRef = ref.child('users/data');
    var byCityRef = ref.child('users/byCity')
    
    // Load children of /users/byCity/Chicago
    byCityRef.child('Chicago').on("child_added", function (snapshot) {
    
      // Find each user's unique ID
      var userID = snapshot.val();
    
      // Then load the User's data from /users/data/{ID}
      userDataRef.child(userID).once(function (snapshot) {
    
        // userID = "Tim"
        // user = {"hair": "red", "eyes": "green", "city": "Chicago"}
        var user = snapshot.val();
    
      });
    });
    

    现在您拥有 Firebase 近乎实时的加载速度和强大的查询功能!

    【讨论】:

    • 安倍的回答很好!我们还将在下周在the blog 上发布有关上下文搜索 (LIKE) 的帖子!
    • 如何在客户端完全做到这一点?我的后端不是用 Node 编写的,但是如果我把你的 Node 脚本放在客户端上,它会导致索引逻辑执行多次(每个客户端在线执行一次)
    【解决方案2】:

    你不能。您需要手动枚举对象并自行搜索。对于一个可能没问题的小数据集。但是你会用更大的数据集消耗带宽。

    Firebase 支持一些使用优先级的有限查询功能,但仍然不是您所要求的。

    它们不支持此类广泛查询的原因是它们针对速度进行了优化。您应该考虑另一种更适合搜索的服务,例如弹性搜索或传统 RDBMS。

    您仍然可以将 firebase 与其他系统一起使用,以利用其优势 - 接近实时的对象获取和同步。

    【讨论】:

      【解决方案3】:

      同时,我正在实现“在火力基地周围搜索的可能性” 在他们的网站上,您有两个有趣的帖子:

      对于基本查询(如果不是enouth,请参阅第2部分):

      第 1 部分:https://www.firebase.com/blog/2013-10-01-queries-part-one.html

      第 2 部分:https://www.firebase.com/blog/2014-01-02-queries-part-two.html

      在第2部分,谈谈如何实现一个like sql 'like %anything%' 在简历中,Firebase 本身并不适合复杂的查询,然后建议与 elasticsearch 互补使用:elasticsearch.org。 对我来说是一些困惑,需要很多服务来做一些简单的事情,比如 find by something。

      Elasticsearch 有很多非常有趣的工具 你可能需要

      1:在同一台服务器上运行的nodejs脚本

      2:正在运行的弹性搜索服务

      3:您的应用与客户端一起搜索。

      【讨论】:

        猜你喜欢
        • 2020-02-28
        • 2021-08-05
        • 1970-01-01
        • 2020-08-25
        • 2021-09-13
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多