我想查询一个在 ES 中被索引的嵌套文档。
例如,嵌套字段是user
包含两个字段id
和name
. 我想查询名称与字段完全匹配的所有文档user.name
。
无法弄清楚如何为此使用 elastic4s DSL。
我想查询一个在 ES 中被索引的嵌套文档。
例如,嵌套字段是user
包含两个字段id
和name
. 我想查询名称与字段完全匹配的所有文档user.name
。
无法弄清楚如何为此使用 elastic4s DSL。
这是您在 elastic4s 中执行嵌套查询的方式:
首先,设置索引以使您具有嵌套类型:
client.execute {
create index "nested" mappings {
"show" as {
"actor" typed NestedType
}
}
}
然后用一些样本数据
client.execute(
index into "nested/show" fields(
"name" -> "game of thrones",
"actor" -> Seq(
Map("name" -> "peter dinklage", "birthplace" -> "Morristown"),
Map("name" -> "pedro pascal", "birthplace" -> "Santiago")
)
)
)
然后是关键部分。要进行搜索,您使用nested
(或在 elastic4s 1.4 beta 中nestedQuery
)“进入”嵌套范围,您可以在其中使用任何标准查询类型进行搜索。这里我只是使用一个简单的termQuery
搜索。
client.execute {
search in "nested/show" query nested("actor").query(termQuery("actor.name" -> "dinklage"))
}
怎么样:
clientProvider.getClient.execute {
(search in path)
.query(
nested("[something].user").query(
bool(must(
term("something.user.name" -> name)
))
)
)
}
由于我不熟悉您的结构,我将提供我自己的示例,也许您可以从那里开始:
def venueByEmployeeId(employeeId: Long): Future[Option[VenueData]] = {
clientProvider.getClient.execute {
(search in path)
.query(
nested("venue.employees").query(
bool(must(
term("venue.employees.id" -> employeeId)
))
)
)
}.map(_.getHits.jsonToList[VenueData].headOption)
}
我确实忘记了查询的是您需要编写整个路径term("venue.employees.id" -> employeeId)