hbe*_*ahc 1 scala elasticsearch elastic4s
我想用elastic4s构建一个动态查询.
我有一个名为myRequest的请求对象,有两个文件(fieldA和fieldB)
实际上我构建我的查询是这样的:
val req =
search in indexName -> indexType query {
bool {
should(
matchQuery("fieldA", myRequest.fieldA.getOrElse("")),
matchQuery("fieldB", myRequest.fieldA.getOrElse("")),
)
}
}
Run Code Online (Sandbox Code Playgroud)
但我想要的是:当fieldA为空时,我的查询中不会添加matchQuery
谢谢你的帮助
hbellahc.
小智 5
您可以使用flatten构建包含所有子查询的列表.这是一个超级详细的代码来说明:
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: _*)
}
}
Run Code Online (Sandbox Code Playgroud)
注意_*类型注释:需要解压缩参数列表.一般来说,每当你调用一个具有可变长度参数列表的方法时,每个类型为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: _*
)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |