Swift,Firebase,手电筒,如何存储阵列?

时间:2016-12-19 11:40:55

标签: ios arrays swift firebase firebase-realtime-database

我目前正在尝试使用Firebase,Flashlight和Swift来创建搜索功能,以便从我的实时数据库中检索随机对象。

我正在尝试在/ search / request

对Firebase执行以下查询
var searchSettings : [Any] = []

    if Settings.searchPackage != 99 {
        searchSettings.append(["match" : Settings.searchPackage])
    }

    if Settings.searchCountry != .world {
        if let region = Locale.current.regionCode {
            searchSettings.append(["match" : region])
        }
    }

    if Settings.searchGender != .All {
        searchSettings.append(["match" : Settings.searchGender.rawValue])
    }

    let postData = [
        "index" : "firebase",
        "type" : "test",
        "body" : [
            "query" : searchSettings
        ]
    ] as [String : Any]

    ref.setValue(postData, withCompletionBlock: { (error, reference) in
        if error == nil {
            FIRDatabase.database().reference().child("search/response").child(ref.key).observeSingleEvent(of: .childAdded, with: { (snapshot) in

                if snapshot.exists() {
                    print("found random snapshot based on settings \(snapshot)")
                }
            })
        }

    })

问题是,正如文档中描述的Firebase目前支持数组,因此"查询"将是:

手电筒会抛出一个错误,因为它需要"查询"包含"匹配"字段而不是它们数组的索引。

我该如何解决这个问题?我希望能够根据多个字段进行搜索。

2 个答案:

答案 0 :(得分:0)

从技术上讲,手电筒并不关心你放在body标签内的所有内容;它只是将其传递给ElasticSearch。因此,如果生成有关格式的错误,那就是正在进行抱怨的ElasticSearch。

你可能遇到的是a)ElasticSearch不喜欢这种语法,或者Firebase的array-like behaviors正在将数组转换为对象。

请注意,Flashlight将允许您传递JSON字符串来代替body。因此,如果这是类似数组的行为的结果,您可以在将查询传递给ES之前对其进行JSON.stringify(),并且它将按照预期从另一端出来。

如果问题是ES语法(在我看来),那么您可以直接针对ES运行查询,直到它们工作,然后修改您的客户端以相应地提交正确的语法。

答案 1 :(得分:0)

看看这个要点: BodyQuery in Swift

我在我的Android应用程序项目中写了这个,我用这个来构建ES的查询。 Here is equivalent in Java for Android ElasticSearch需要json查询,您可以使用Maps(Android)/ Dictionaries(iOS)轻松创建它。享受:)