gpt4 book ai didi

json - 来自Haskell的查询请求,其查询次数是 “same data”的两倍

转载 作者:行者123 更新时间:2023-12-02 22:23:21 24 4
gpt4 key购买 nike

我试图用Haskell(Aeson)向Elasticsearch发出Http请求。

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\":[{\"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}"}



这是一个逻辑错误。但我不知道该如何解决...

我以这种方式制作“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.FunctionScore中编写RW.query。
我不知道该如何解决,因为“响应”没有问题,但是对于“请求”来说,这是一个问题。

也许以前有人尝试过这样的事情。

最佳答案

我修好了它。我不得不从toJSON重新声明aeson实例

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

而且效果很好。

关于json - 来自Haskell的查询请求,其查询次数是 “same data”的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42559287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com