2017-03-02 1 views
2

Haskell(Aeson)とElasticsearchでHttpリクエストを作成しようとしています。「同じデータ」の2倍のHaskellからのクエリリクエスト

Elasticsearch本体はそうなります

{ 
    "query": { 
     "function_score": { 
      "query": { 
       "bool": { 
        "should": [ 
         {"term": {"word_n_gram": "str"}}, 
         {"term": {"word_n_gram": "not"}}       
        ] 
       } 
      }, 
      "functions": [ 
       { 
        "script_score": { 
         "script": { 
          "lang": "groovy", 
          "file": "test-score", 
          "params": { 
           "boostBy": { 
            "str": 1, 
            "not": 1 
           } 
          } 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

そして、それは正常に動作します。

だから、私はHaskellで "同等" を作っ:ポイントは、Haskellで、私は2回、 "クエリ" を持つことはできませんされて

data QueryRequest = QueryRequest { 
    query :: Query 
} deriving (Eq, Generic, Show) 

instance ToJSON QueryRequest 

data Query = Query { 
    function_score :: FunctionScore 
} deriving (Eq, Generic, Show) 

instance ToJSON Query 

data FunctionScore = FunctionScore { 
    queryIn :: QueryIn 
    , functions :: [Functions] 
} deriving (Eq, Generic, Show) 

instance ToJSON FunctionScore 

data QueryIn = QueryIn { 
    bool :: BoolQuery 
} deriving (Eq, Generic, Show) 

instance ToJSON QueryIn 

data BoolQuery = BoolQuery { 
    should :: [ShouldQuery] 
} deriving (Eq, Generic, Show) 

などを...

FailureResponse {responseStatus = Status {statusCode = 400, statusMessage = "Bad Request"}, responseContentType = application/json;charset=UTF-8, responseBody = "{\"error\":{\"root_cause\":[{\"type\":\"parsing_exception\",\"reason\":\"no [query] registered for [queryIn]\",\"line\":1,\"col\":39}],\"type\":\"parsing_exception\",\"reason\":\"no [query] registered for [queryIn]\",\"line\":1,\"col\":39},\"status\":400}"}

論理エラーです:私は、要求を作ってるんだ、とElasticsearchはquery 2回を待っているので、私はqueryInを書いた理由ですが、宣言が、私はこのエラーを取得します。しかし、私はこのように「RequestQuery」を作る....私はそれを修正することができる方法

を知らない:

toElasticSearchQuery :: T.Text -> RW.QueryRequest 
toElasticSearchQuery word = 
    RW.QueryRequest { 
    RW.query = RW.Query { 
     RW.function_score = RW.FunctionScore { 
     RW.queryIn = RW.QueryIn { 
      RW.bool = RW.BoolQuery { 
      RW.should = toShouldQueryList (splitInNGrams word) 
      } 
     }, 
     RW.functions = [ 
      RW.Functions { 
      RW.scriptScore = RW.ScriptScore { 
       RW.script = RW.Script { 
       RW.lang = scriptLang, 
       RW.file = scriptFile, 
       RW.params = RW.Params { 
        RW.boostBy = fixGramConter (splitInNGrams word) 
       } 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 

そしてもちろん、私は内部のRW.queryを書き込むことはできませんRW.FunctionScore。 私はそれを修正できるかどうかわかりませんが、レスポンスは問題ありませんが、リクエストでは問題です。

多分誰かが前にそのようなことを試みました。

答えて

2

私はそれを修正しました。私はaeson

instance ToJSON FunctionScore where 
    toJSON (FunctionScore q f) = object ["query" .= q, "functions" .= f] 

からtoJSONインスタンスを再宣言しなければならなかったし、それがうまく動作します。

関連する問題