2017-03-02 1 views
2

Ich versuche, eine Http-Anfrage mit Haskell (Aeson) zu Elasticsearch zu machen.Anfrage von Haskell mit zwei Mal die "gleichen Daten"

Der Elasticsearch Körper sieht so:

{ 
    "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 
           } 
          } 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

Und es funktioniert einwandfrei.

Also, ich machte die "gleichwertig" in Haskell:

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) 

und so weiter ...

der Punkt ist, in Haskell, kann ich nicht zwei Mal die "Abfrage" haben Erklärung, die ist, warum ich queryIn schrieb aber, da ich eine Anfrage zu machen und Elasticsearch wartet auf query zweimal, bekomme ich diesen Fehler:

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}"}

, die ein logischer Fehler ist. Aber ich weiß nicht, wie ich es beheben könnte ....

ich die „RequestQuery“ machen auf diese Weise:

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) 
       } 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 

Und natürlich kann ich nicht schreiben RW.query innerhalb der RW.FunktionScore. Ich weiß nicht, wie ich es beheben kann, denn eine Antwort wäre kein Problem, aber für eine Anfrage ist es ein Problem.

Vielleicht hat jemand so etwas vorher versucht.

Antwort

2

Ich habe es behoben. Ich hatte die toJSON Instanz von aeson

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

und es funktioniert gut zu deklarieren.

Verwandte Themen