我在以下类型的弹性搜索索引中嵌套了对象
"_source": {
"NAME": "MNQ",
"LAST_MOD_DATE": 1373587200000,
"ACTIVE_FL": "Y",
"ID": "1008",
"USER": [
{
"USR_ID": 499,
"STATUS": "INACTV",
"NAME": "ABC"
},
{
"USR_ID": 53,
"STATUS": "ACTV",
"NAME": "XYZ"
}
]
}
我有以下用例来查询索引:
1008
的用户,在这种情况下将是用户XYZ
USER.NAME
上聚合,但它应该只返回活跃用户的名字。我无法执行这些嵌套操作,因为搜索活动状态将返回一条甚至其中一个用户处于活动状态的记录。我无法专门过滤掉非活动用户。非常感谢在这方面的任何帮助。
答案 0 :(得分:0)
因为您总是对提取用户感兴趣,所以在这种情况下parent-child关系将比用户的嵌套文档类型做得更好。与嵌套类型一样,响应将具有不必要的有效负载,其中inner_hits用于弹性。
为嵌套关联提供更好的导航和更灵活的查询,然后嵌套类型。
同样在映射中,您可能必须选择类型为keyword
或创建自定义分析器以保留案例,因为您搜索的是区分大小写的搜索。
亲子关系的映射
PUT parent_child_index
{
"mappings": {
"parent_document": {
"properties": {
"NAME": {
"type": "keyword"
}
}
},
"user": {
"_parent": {
"type": "parent_document"
},
"properties": {
"USER_ID": {
"type": "keyword"
},
"STATUS": {
"type": "keyword"
},
"NAME": {
"type": "keyword"
}
}
}
}
}
索引父子文档
POST parent_child_index/parent_document
{
"NAME": "MNQ",
"LAST_MOD_DATE": 1373587200000,
"ACTIVE_FL": "Y",
"ID": "1008"
}
POST parent_child_index/user?parent=AVyBzQXmp_hWdUR22wGr
{
"USR_ID": 53,
"STATUS": "ACTV",
"NAME": "XYZ"
}
<强>查询强>
POST parent_child_index/user/_search
{
"query": {
"bool": {
"must": [{
"has_parent": {
"parent_type": "parent_document",
"query": {
"bool": {
"must": [{
"term": {
"ID": {
"value": "1008"
}
}
}]
}
}
}
},
{
"term": {
"STATUS": {
"value": "ACTV"
}
}
}
]
}
}
}
POST parent_child_index/user/_search
{
"size": 0,
"aggs": {
"active_users": {
"filter": {
"term": {
"STATUS": "ACTV"
}
},
"aggs": {
"user_name": {
"terms": {
"field": "NAME",
"size": 10
}
}
}
}
}
}