我目前正在尝试使用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文档中所描述的,它目前支持数组,因此"query“的内容将是:

Flashlight将抛出一个错误,因为它期望"query“包含"match”字段,而不是它们数组的索引。
我该怎么解决这个问题?我希望能够基于多个字段进行搜索。
发布于 2016-12-20 06:32:12
从技术上讲,Flashlight根本不关心您在body标记中放了什么;它只是将它传递给ElasticSearch。因此,如果生成了关于格式的错误,则是ElasticSearch发出了抱怨。
你在这里可能遇到的情况是: a) ElasticSearch不喜欢这种语法,或者Firebase的array-like behaviors正在将数组转换为对象。
请注意,Flashlight将允许您传递一个JSON字符串来代替body。因此,如果这是类似数组的行为的结果,您可以在将查询传递到ES之前使用JSON.stringify(),它将按预期从另一端传出。
如果问题出在ES语法上(就像我看到的那样),那么您可以直接对ES运行查询,直到它们正常工作,然后修改您的客户端以相应地提交正确的语法。
发布于 2017-03-16 17:29:23
看看这个要点:BodyQuery in Swift
我在我的Android应用程序项目中编写了这段代码,并使用它为ES构建查询。Here is equivalent in Java for Android ElasticSearch需要一个json查询,您可以使用地图(安卓)/Dictionaries (iOS)轻松创建它。享受:)
https://stackoverflow.com/questions/41221802
复制相似问题