elasticsearch查询中的嵌套对象检索

eimct9ow  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(383)

我是elasticsearch的新手,对于匹配特定条件时的嵌套对象检索,我有几个问题。
我有一个树状结构如下:

{

    "id": 4,
    "sora": [
        {
            "pContext": {
                "context": {
                    "sT": "D3",
                    "uT": "ST"
                },
                "entities": [
                    {
                        "name": "premium",
                        "bName": "premium",
                        "fT": "site",
                        "eT": "F_P",
                        "children": [
                            {
                                "name": "capa",
                                "bName": "capa",
                                "fT": "site",
                                "eT": "FFT",
                                "children": []
                            },
                            {
                                "name": "code",
                                "bName": "Codes",
                                "fT": "site",
                                "eT": "FFT",
                                "children": []
                            },
                            {
                                "name": "selection A",
                                "fT": "site",
                                "eT": "SELECTION_A",
                                "children": [
                                    {
                                        "name": "A1",
                                        "fT": "site",
                                        "eT": "ADD",
                                        "children": []
                                    },
                                    {
                                        "name": "A2",
                                        "fT": "site",
                                        "eT": "ADD",
                                        "children": []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        },
        {
            "pContext": {
                "context": {
                    "sT": "D2",
                    "uT": "ST"
                },
                "entities": [
                    {
                        "name": "112",
                        "bName": "112",
                        "eT": "D_TYPE",
                        "children": []
                    }
                ]
            }
        }
    ]
}

我的结构可以有更多的层次。
我有许多上述文件。为了过滤我的文档,我可以使用简单查询sintax:

{
    "_source": {
        "excludes": [
            "*.context"
        ]
    },
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "sora.pContext.context.sT": "D3"
                    },
                    "match": {
                        "sora.pContext.entities.name": "premium"
                    },
                    "match": {
                        "sora.pContext.entities.fT": "site"
                    }
                }
            ]
        }
    }
}

我想知道的是,如何获得与查询及其子对象匹配的嵌套对象。我需要匹配必须包含筛选器的对象。有可能吗?
如何在不指定路径的情况下搜索字段?
谢谢

编辑

我的Map:

{
    "mappings": {
        "abc": {
            "properties": {
                "id": {
                    "type": "integer"
                },
                "sora": {
                    "type": "nested",
                    "properties": {
                        "pContext": {
                            "type": "nested",
                            "properties": {
                                "context": {
                                    "type": "nested",
                                    "properties": {
                                        "sT": {
                                            "type": "text"
                                        },
                                        "uT": {
                                            "type": "text"
                                        }
                                    }
                                },
                                "entities": {
                                    "type": "nested",
                                    "properties": {
                                        "name": {
                                            "type": "text"
                                        },
                                        "bName": {
                                            "type": "text"
                                        },
                                        "fT": {
                                            "type": "text"
                                        },
                                        "eT": {
                                            "type": "text"
                                        },
                                        "children": {
                                            "type": "object"                                    
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
oalqel3c

oalqel3c1#

好吧,如果其他人也面临同样的问题,我的解决方案是将所有子级添加到与父级相同的路径/级别,但保留与父级及其子级的Map。这样,我就可以根据需要搜索和检索父对象的各个部分。

r1zk6ea1

r1zk6ea12#

是的,您可以通过使用内部点击和嵌套查询来获得匹配的对象,而不是您添加到问题中的对象。
您的查询如下所示:

{
  "_source": {
    "excludes": [
      "*.context"
    ]
  },
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "inner_hits": {},
            "path": "sora.pContext",
            "query": {
              "bool": {
                "must": [
                  {
                    "nested": {
                      "path": "sora.pContext.context",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "match": {
                                "sora.pContext.context.sT": "D3"
                              }
                            }
                          ]
                        }
                      }
                    }
                  },
                  {
                    "nested": {
                      "path": "sora.pContext.entities",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "match": {
                                "sora.pContext.entities.name": "premium"
                              }
                            },
                            {
                              "match": {
                                "sora.pContext.entities.fT": "site"
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

我已经添加了链接到internal\u hits文档,在这里您可以了解结果的样子。

相关问题