在 Elasticsearch 中搜索复杂的嵌套 JSON 对象

问题描述 投票:0回答:0

如何在 Elasticsearch 中高效搜索嵌套的 JSON 对象,只返回相关数据而不返回整个文档?

我有一个 JSON 对象,表示将按用户摄取的菜单结构。每个菜单项都有嵌套字段,例如文本、网址、区域和子项。我希望能够搜索这些字段中的任何一个,并只返回搜索查询的相关数据。例如,如果我搜索“工作流程角色”,我只想返回相关菜单项而不是所有额外数据。

我已经尝试为菜单对象创建一个嵌套映射,但是我使用内部命中的查询返回了太多数据。我也尝试过路径过滤器,但没有找到令人满意的解决方案。

所以我的问题是:

  1. 在中摄取深度嵌套的 JSON 对象的最佳方法是什么 用于高效搜索的 Elasticsearch?
  2. 对于这样一个深度嵌套的映射应该如何构造 对象?
  3. 我怎样才能写一个查询,让我可以搜索所有嵌套的 字段并仅返回搜索查询的相关数据?

这里是需要查找的JSON对象的例子:

[
  {
    "MenuStructure": 0,
    "NavigationLinkId": 0,
    "Children": [
      {
        "MenuStructure": 0,
        "NavigationLinkId": 111,
        "Text": "Bulk Actions",
        "Action": "Index",
        "Controller": "BulkUpload",
        "Area": "Company",
        "Url": "/some-url/bulk-upload",
      }
    ]
  },
  {
    "MenuStructure": 1,
    "NavigationLinkId": 1,
    "Children": [
      {
        "MenuStructure": 1,
        "NavigationLinkId": 2,
        "Text": "Company Config",
        "Area": "Company",
        "Url": "javascript:void(0);",
        "Children": [
          {
            "MenuStructure": 1,
            "NavigationLinkId": 0,
            "Text": "Basic Settings",
            "Url": "javascript:void(0);",
            "Children": [
              {
                "MenuStructure": 1,
                "NavigationLinkId": 60668,
                "Text": "Company Settings",
                "Icon": "fas fa-cogs",
                "Url": "javascript:void(0);",
                "Children": [
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 27,
                    "Text": "Basic Company Information",
                    "Icon": "fa fa-building",
                    "Action": "Index",
                    "Controller": "CompanyProfile",
                    "Area": "Company",
                    "Url": "/some-url/company-profile",
                  },
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 163,
                    "Text": "Reminder Contact Details",
                    "Icon": "fas fa-balance-scale-right",
                    "Url": "/some-url/classic/163",
                  }
                ]
              },
              {
                "MenuStructure": 1,
                "NavigationLinkId": 0,
                "Text": "Dropdown Management",
                "Icon": "fas fa-users-class",
                "Url": "javascript:void(0);",
                "Children": [
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 261,
                    "Text": "Workflow Roles",
                    "Action": "Index",
                    "Controller": "CompanyWorkflowRoles",
                    "Area": "Company",
                    "Url": "/some-url/workflow-roles"
                  },
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 50323,
                    "Text": "Other Dropdowns",
                    "Icon": "fas fa-balance-scale-right",
                    "Url": "/some-url/classic/50323"
                  }
                ]
              },
              {
                "MenuStructure": 1,
                "NavigationLinkId": 50327,
                "Text": "Legislative Configurations",
                "Icon": "fas fa-balance-scale-right",
                "Url": "javascript:void(0);",
                "Children": [
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 244,
                    "Text": "Statistics SA Config",
                    "Url": "/some-url/classic/244"
                  }
                ]
              }
            ]
          },
          
          {
            "MenuStructure": 1,
            "NavigationLinkId": 167,
            "Text": "Security",
            "Icon": "fa fa-lock",
            "Url": "javascript:void(0);",
            "Children": [
              {
                "MenuStructure": 1,
                "NavigationLinkId": 167,
                "Text": "Security",
                "Icon": "fa fa-lock",
                "Url": "javascript:void(0);",
                "Children": [
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 168,
                    "Text": "User Profiles",
                    "Url": "/some-url/classic/168",
                  },
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 169,
                    "Text": "Security Roles",
                    "Url": "/some-url/classic/169",
                  },
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 188,
                    "Text": "User Org. Unit Permissions",
                    "Url": "/some-url/classic/188",
                  },
                  {
                    "MenuStructure": 1,
                    "NavigationLinkId": 60610,
                    "Text": "Activate Users",
                    "Url": "/some-url/classic/60610",
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

为此,我尝试为菜单对象创建嵌套字段类型映射。这是一个示例映射:

PUT my-index
{
  "mappings": {
    "properties": {
        "user_id": {
            "type": "keyword"
        }
        "menu": {
            "type": "nested",
            "properties": {
            ....
            }
        }
    }
  }
}

如何搜索子项的任何嵌套属性,我尝试了以下和其他一些类似类型的查询:

GET my-index/_search
{
  "query": {   
    "nested": {
      "path": "menu",
      "query": {
        "bool": {
          "must": [
            {"match": 
            {
              "menu.Children.Area": "Company"
            }
            }
          ]
        }
      },
      "inner_hits": {"highlight": {"fields": {"menu.Children.Area": {}}}}
    }
  }
}

上面的查询并没有真正起作用,因为它基本上返回了这么多数据。我只想返回内部匹配项,例如,如果您搜索“工作流程角色”,则只返回

{
    "MenuStructure": 1,
    "NavigationLinkId": 261,
    "Text": "Workflow Roles",
    "Action": "Index",
    "Controller": "CompanyWorkflowRoles",
    "Area": "Company",
    "Url": "/some-url/workflow-roles"
}

不是所有的额外数据。我已经尝试了很多与 path_filters 等的组合。但我想我正在走这条路。

elasticsearch nest
© www.soinside.com 2019 - 2024. All rights reserved.