繁体   English   中英

Swift,Firebase,Flashlight,如何存储数组?

[英]Swift, Firebase, Flashlight, how to store arrays?

我目前正在尝试使用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当前在文档中所述,它确实支持数组,因此“查询”的内容为:

Flashlight将引发错误,因为它希望“查询”包含“匹配”字段,而不包含它们的数组索引。

我该如何解决? 我希望能够基于多个字段进行搜索。

从技术上讲,手电筒根本不关心您在body标签中放置的内容。 它只是将其传递给ElasticSearch。 因此,如果生成有关格式的错误,则抱怨的是ElasticSearch。

您可能在这里遇到的是:a)ElasticSearch不喜欢该语法,或者Firebase的类似于数组的行为将数组转换为对象。

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

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

看看这个要点: Swift中的BodyQuery

我在Android应用程序项目中编写了此代码,并使用它来构建ES查询。 这等效于Java for Android, ElasticSearch需要json查询,您可以使用Maps(Android)/ Dictionaries(iOS)轻松创建它。 请享用 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM