我需要从包含嵌套数据的elasticsearch查询中获取数据。 数据源设置为true。添加'字段'
"fields":["*"],
"query": {
...
返回根级别的所有数据。
但我需要获取嵌套文档中的数据(实际上是嵌套的嵌套文档)。 使用_source和具有嵌套对象引用的字段
"fields":["products.envs.title"],
到目前为止没有喜悦。
任何人都知道如何将这些数据作为查询的一部分。
查询包括聚合,并且返回正常,但也需要将嵌套数据作为结果的一部分,以便我可以检查标志并返回依赖于标志调用的数据。
答案 0 :(得分:1)
您没有指定映射和对象结构,所以我创建了自己的映射,如下所示:
POST /so/so/1
{
"id": 1,
"user": {
"name": "adam",
"role": {
"code": "admin"
}
}
}
现在让我们尝试使用fields
参数查询数据并剪切返回结果
查询:
POST /so/so/_search
{
"fields": [
"id",
"user.role.code"
],
"query": {
"match_all": {}
}
}
结果:
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "so",
"_type": "so",
"_id": "1",
"_score": 1,
"fields": {
"user.role.code": [
"admin"
],
"id": [
1
]
}
}
]
}
正如您所看到的,一切正常。问题是如果你想告诉你要返回像“user”或“user.role”这样的整个对象,那么你将得到“field [X]不是叶子字段”异常。唯一的解决方案是停止使用fields
参数并开始使用_source
参数来剪切数据 - 此问题在此处描述:https://github.com/elastic/elasticsearch/issues/4888。另外,建议不要使用fields
参数,并且应始终使用_source
参数,如下所示
查询:
POST /so/so/_search
{
"_source": [
"id",
"user.role.code"
],
"query": {
"match_all": {}
}
}
响应:
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "so",
"_type": "so",
"_id": "1",
"_score": 1,
"_source": {
"id": 1,
"user": {
"role": {
"code": "admin"
}
}
}
}
]
}