2016-12-19 10 views
0

現在Firebase、Flashlight、Swiftを使用して、リアルタイムデータベースからランダムオブジェクトを取得する検索機能を作成しようとしています。Swift、Firebase、懐中電灯、アレイの保管方法は?

私はこの問題は、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でエラーが発生します。

どうすればこの問題を解決できますか?私は複数のフィールドに基づいて検索できるようにしたい。

+0

通常、あなたは配列を持って、それに "含む"操作をしたい場合は、実際にセットを使用する必要があります。 [私の答えはこちら](http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value)を参照してください。なぜこれらのカテゴリをトップに引き上げるべきか説明していますレベルリスト。 –

+0

懐中電灯は単純にそのクエリーをESに渡しているので、そのフォーマットについて不平を言っているのはESです。私はESのシンタックスエキスパートではありませんが、以前はその構造のクエリーは見ていませんでした。 ESでここに書いたとおりに動作することを、どのように確認しましたか? [ここでは、複数のフィールドマッチについて見ています(https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-multi-match-query.html)。 – Kato

答えて

0

技術的には、懐中電灯はbodyタグの中に何を入れても気にしません。それを単にElasticSearchに渡します。したがって、フォーマットに関するエラーが発生した場合、それは不平を言っているElasticSearchです。

おそらく、ここで実行しているのは、a)ElasticSearchはその構文が気に入らないか、Firebaseのarray-like behaviorsが配列をオブジェクトに変換しています。

懐中電灯では、bodyの代わりにJSON文字列を渡すことができます。したがって、これが配列のような振る舞いの結果である場合は、ESに渡す前にJSON.stringify()を実行して、もう一方の目的を果たすようにします。

問題がESの構文(私のように見える)の場合は、動作するまで直接ESに対してクエリを実行し、それに応じて正しい構文を送信するようにクライアントを修正することができます。

0

は、この主旨を見てみましょう: BodyQuery in Swift

を、私は私のAndroidアプリケーションのプロジェクトでこれを書いて、私はESのためのクエリを構築するために、これを使用しています。 Here is equivalent in Java for Android ElasticSearchにはjsonクエリが必要で、Maps(Android)/ Dictionaries(iOS)を使用して簡単に作成できます。お楽しみください:)

関連する問題