如何在 Elasticsearch 中高效搜索嵌套的 JSON 对象,只返回相关数据而不返回整个文档?
我有一个 JSON 对象,表示将按用户摄取的菜单结构。每个菜单项都有嵌套字段,例如文本、网址、区域和子项。我希望能够搜索这些字段中的任何一个,并只返回搜索查询的相关数据。例如,如果我搜索“工作流程角色”,我只想返回相关菜单项而不是所有额外数据。
我已经尝试为菜单对象创建一个嵌套映射,但是我使用内部命中的查询返回了太多数据。我也尝试过路径过滤器,但没有找到令人满意的解决方案。
所以我的问题是:
这里是需要查找的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 等的组合。但我想我正在走这条路。