gpt4 book ai didi

scala - 使用elastic4s动态构建弹性请求

转载 作者:行者123 更新时间:2023-12-02 22:44:57 25 4
gpt4 key购买 nike

我想用elastic4s建立一个动态查询。

我有一个名为myRequest的请求对象,具有两个文件域(fieldA和fieldB)

实际上我建立这样的查询:

val req =
search in indexName -> indexType query {
bool {
should(
matchQuery("fieldA", myRequest.fieldA.getOrElse("")),
matchQuery("fieldB", myRequest.fieldA.getOrElse("")),

)
}
}

但是我想拥有的是:当fieldA为空时,不会将matchQuery添加到我的查询中

谢谢你的帮助

赫贝拉赫茨。

最佳答案

您可以使用flatten构造包含所有子查询的列表。这是一个 super 冗长的代码,用于说明:

val fieldA: Option[String] = ...
val fieldB: Option[String] = ...
val shouldA: Option[QueryDefinition] = fieldA.map(a => matchQuery("fieldA", a))
val shouldB: Option[QueryDefinition] = fieldB.map(b => matchQuery("fieldB", b))
val req =
search in indexName -> indexType query {
bool {
should(Seq(shouldA, shouldB).flatten: _*)
}
}

注意 _*类型注释:需要解压缩参数列表。一般而言,每当调用具有可变长度参数列表(每个类型为T)的方法时,都可以获取 Seq[T]并使用 : T*解压缩。为了方便起见,您可以改为使用 _*,编译器将为您推断类型。

因此,简洁的方法是:
def search(maybeA: Option[String], maybeB: Option[String]) = 
search in indexName -> indexType query {
bool {
should(
Seq(
maybeA.map(a => matchQuery("fieldA", a),
maybeB.map(b => matchQuery("fieldB", b)
).flatten: _*
)
}
}

关于scala - 使用elastic4s动态构建弹性请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383846/

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