【问题标题】:Firebase query multiple keys Android clientFirebase 查询多键 Android 客户端
【发布时间】:2017-07-13 15:29:43
【问题描述】:

我在 facedetails 中有 14 个属性我想查询并为每个属性找到最接近的匹配项,并且只有当 14 个属性与人脸匹配时,我的代码才会返回人对象。 这是数据库上的一个示例:

"faceDetails":{
    "mCalculateFaceSizeHeight" : 121,
    "mCalculateFaceSizeWidth" : 107,
    "mCalculateLeftEyeBrowSizeHeight" : 31,
    "mCalculateLeftEyeBrowSizeWidth" : 43,
    "mCalculateLeftEyeSizeHeight" : 64,
    "mCalculateLeftEyeSizeWidth" : 10,
    "mCalculateMouthSizeHeight" : 24,
    "mCalculateMouthSizeWidth" : 30,
    "mCalculateNoseSizeHeight" : 43,
    "mCalculateNoseSizeWidth" : 71,
    "mCalculateRightEyeBrowSizeHeight" : 43,
    "mCalculateRightEyeBrowSizeWidth" : 52,
    "mCalculateRightEyeSizeWidth" : 14,
    "mCalculatedRightEyeSizeHeight" : 36
            }

目前在 Android 设备中我有这样的东西。

Query personLeftEyeSizeWidthQueryendAt = myRef.orderByChild("mCalculateLeftEyeSizeWidth")
                .endAt(mCalculateLeftEyeSizeWidth())
                .limitToLast(1);
        personLeftEyeSizeWidthQuery.addChildEventListener(new ChildEventListener() {....

Query personLeftEyeSizeWidthQueryStartAt = myRef.orderByChild("mCalculateLeftEyeSizeWidth")
                    .startAt(mCalculateLeftEyeSizeWidth())
                    .limitToFirst(1);
            personLeftEyeSizeWidthQuery.addChildEventListener(new ChildEventListener() {....


My index is like this:
".indexOn": [
        "mCalculateLeftEyeSizeWidth",
        "mCalculateLeftEyeSizeHeight",
        "mCalculateRightEyeSizeWidth",
        "mCalculatedRightEyeSizeHeight",
        "mCalculateNoseSizeWidth",
        "mCalculateNoseSizeHeight",
        "mCalculateMouthSizeWidth",
        "mCalculateMouthSizeHeight",
        "mCalculateLeftEyeBrowSizeWidth",
        "mCalculateLeftEyeBrowSizeHeight",
        "mCalculateRightEyeBrowSizeWidth",
        "mCalculateRightEyeBrowSizeHeight",
        "mCalculateFaceSizeWidth",
        "mCalculateFaceSizeHeight"

      ]

我的问题是我是否会向前推进 28 个单个查询,每个单个查询或有更好的方法来组合所有 28 个。 我不想放弃其中的一些,因为人脸识别的准确性对于找到匹配项非常重要。 让我知道我是否应该继续执行 28 个单个查询,然后检查每个查询的键以查看它们都匹配同一个人或其他方法。

谢谢 埃兰·格罗斯

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

当前的 Firebase 数据库 API 没有提供组合查询的确切方法。
但是,来自 Firebase 的 the video 人告诉如何构建数据库以减轻负担。
我建议,而不是分开 @987654323 @ 和 leftEyeWidth 您可以通过简单的 leftEyeSize 将它们合并起来,其值可以写为 (leftEyeHeight, leftEyeWidth) 即使您手动编写每个查询,这也会使您的问题减半

【讨论】:

  • 不确定合并两个值是否会起作用。数据库理解数字 int 字符串,这就是为什么我将它划分为以 .startAt(mCalculateLeftEyeSizeWidth()) 返回 int 并搜索该值开头的原因。如果您将值组合到 point(widht,height) 例如 mCalculateLeftEyeSize() = (14,20) 那么数据库将无法搜索。 .startAt(mCalculateLeftEyeSize()) = > 这不起作用。我没有在 Firebase 上尝试过,但已经测试了几个数据库,他们不理解点值......
  • 我在看源代码。 Query.class= > .startAt 和 .endAt boolean String Double
  • 是的,我已经看到了,在示例中它们正在组合多个字符串。然后搜索根字符串... Firebase 尽可能推荐平面数据库。最终我需要数值来运行查询。我不想像 eyeSize = width * height return eyeSize 那样组合实际值
  • 我希望他们能发布一个更新,提供更好的查询类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多