Я пытаюсь сделать запрос Http с Haskell (Aeson) в Elasticsearch.
Корпус 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:
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)
и так далее...
Дело в том, что в haskell у меня не может быть дважды объявления "запроса", поэтому я написал queryIn
, но, поскольку я делаю запрос, а Elasticsearch ждет query
два раза, я получаю эту ошибку:
FailureResponse {responseStatus = Status {statusCode = 400, statusMessage = "Bad Request"}, responseContentType = application / json; charset = UTF-8, responseBody = "{\" error \ ": {\" root_cause \ ": [{\ "тип \": \ "исключение синтаксического анализа \", \ "причина \": \ "не зарегистрирован [запрос] для [queryIn] \", \ "строка \": 1, \ "col \": 39}], \ "тип \": \ "исключение_парсинга \", \ "причина \": \ "не зарегистрирован [запрос] для [queryIn] \", \ "строка \": 1, \ "col \": 39}, \ " статус \ ": 400}"}
что является логической ошибкой. Но я не знаю, как бы это исправить ....
Я делаю 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. Я не знаю, как это исправить, для ответа не будет проблем, но для запроса это проблема.
Может, кто-то раньше пробовал что-то подобное.