Firebase查询多密钥Android客户端

Firebase查询多密钥Android客户端,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想查询facedetails中的14个属性,并为每个属性找到最接近的匹配项,只有当14个属性与person face匹配时,我的代码才会返回person对象。 以下是数据库中的一个示例: "faceDetails":{ "mCalculateFaceSizeHeight" : 121, "mCalculateFaceSizeWidth" : 107, "mCalculateLeftEyeBrowSizeHeight" : 31, "mCalculateLeftE

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

"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
            }
目前在安卓设备中,我有类似的东西

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个单一查询,然后检查每个查询的键,看看它们是否都匹配同一个人或其他方法

谢谢
Eran Gross

当前的Firebase数据库API没有提供组合查询的确切方式。
但是,Firebase亲自告诉您如何构建数据库以减轻负担。
我建议,您不必分离
lefteyehight
leftEyeWidth
,只需通过
leftEyeSize
将它们合并,其值可以写为
(lefteyehight,leftEyeWidth)
即使您手动编写每个查询,这也会将问题减半。

当前的Firebase数据库API没有提供组合查询的确切方式。
但是,Firebase亲自告诉您如何构建数据库以减轻负担。
我建议,您不必分离
lefteyehight
leftEyeWidth
而只需通过
leftEyeSize
将它们合并,其值可以写为
(lefteyehight,leftEyeWidth)
这将使问题减半,即使您手动编写每个查询

,但不确定合并两个值是否有效。DB understand number int字符串,这就是我将其拆分为so开头的原因。startAt(mCalculateLeftEyeSizeWidth())返回int并搜索该值。如果将这些值组合到点(宽、高),例如mCalculateLeftEyeSize()=(14,20),则数据库将无法搜索。startAt(mCalculateLeftEyeSize())=>这将不起作用。我没有在Firebase上尝试,但已经测试了一些DB,他们不理解点值…你看过这个讨论了吗?我正在看源代码。Query.class=>.startAt和.endAt布尔字符串double是的,我已经看到了,在示例中它们组合了多个字符串。然后搜索根字符串。。。Firebase建议尽可能使用平面数据库。最后,我需要number值来运行查询。我不想合并实际值,比如eyeSize=width*height返回eyeSize我希望他们会发布一个更新,提供更好的查询类不确定合并两个值是否有效。DB understand number int字符串,这就是我将其拆分为so开头的原因。startAt(mCalculateLeftEyeSizeWidth())返回int并搜索该值。如果将这些值组合到点(宽、高),例如mCalculateLeftEyeSize()=(14,20),则数据库将无法搜索。startAt(mCalculateLeftEyeSize())=>这将不起作用。我没有在Firebase上尝试,但已经测试了一些DB,他们不理解点值…你看过这个讨论了吗?我正在看源代码。Query.class=>.startAt和.endAt布尔字符串double是的,我已经看到了,在示例中它们组合了多个字符串。然后搜索根字符串。。。Firebase建议尽可能使用平面数据库。最后,我需要number值来运行查询。我不想结合实际值,比如像eyeSize=width*height return eyeSize我希望他们会发布一个更新,提供更好的查询类检查我对这个问题的回答检查我对这个问题的回答