【问题标题】:Swift, Firebase, Flashlight, how to store arrays?Swift、Firebase、Flashlight,如何存储数组?
【发布时间】:2016-12-19 11:40:54
【问题描述】:

我目前正在尝试使用 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 会抛出错误,因为它希望“查询”包含“匹配”字段,而不是它们的数组的索引。

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

【问题讨论】:

  • 通常当你有一个数组并想要对其进行“包含”操作时,你实际上应该使用一个集合。请参阅my answer here,这也解释了为什么您应该将这些类别拉到顶级列表中。
  • 由于 Flashlight 只是将该查询传递给 ES,因此 ES 会抱怨格式。我不是 ES 语法专家,但我以前从未见过该结构中的查询。您如何验证它是否像您在 ES 中编写的那样工作? [这是我看到的多个字段匹配的内容](elastic.co/guide/en/elasticsearch/reference/2.3/…

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


【解决方案1】:

从技术上讲,Flashlight 根本不关心您在 body 标记中放入的内容;它只是将它传递给 ElasticSearch。因此,如果生成了有关格式的错误,则 ElasticSearch 正在抱怨。

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

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

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

【讨论】:

    【解决方案2】:

    看看这个要点: BodyQuery in Swift

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多