3

我想查询一个在 ES 中被索引的嵌套文档。

例如,嵌套字段是user包含两个字段idname. 我想查询名称与字段完全匹配的所有文档user.name

无法弄清楚如何为此使用 elastic4s DSL。

4

2 回答 2

4

这是您在 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"))
}
于 2014-10-31T23:37:30.593 回答
2

怎么样:

clientProvider.getClient.execute {
    (search in path)
      .query(
        nested("[something].user").query(
        bool(must(
          term("something.user.name" -> name)
        ))
        )
      )
    }

由于我不熟悉您的结构,我将提供我自己的示例,也许您可​​以从那里开始:

  • 场地数据由关于场地和场地本身的元数据组成。
  • 场地得到了一个 NestedType nested() 的员工列表
  • 员工的 id 类型为 Long

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)

于 2015-04-13T12:13:54.233 回答