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.