ElasticSearch - 用于在嵌套对象术语上过滤和聚合的查询

时间:2017-06-06 19:50:36

标签: elasticsearch nested

我在以下类型的弹性搜索索引中嵌套了对象

 "_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"
              }
            ]
        }

我有以下用例来查询索引:

  • 获取特定ID的所有活跃用户。例如:我希望获得有效身份1008的用户,在这种情况下将是用户XYZ
  • 获取所有活跃用户。例如:我执行match_all查询,我想在术语USER.NAME上聚合,但它应该只返回活跃用户的名字。

我无法执行这些嵌套操作,因为搜索活动状态将返回一条甚至其中一个用户处于活动状态的记录。我无法专门过滤掉非活动用户。非常感谢在这方面的任何帮助。

1 个答案:

答案 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
                    }
                }
            }
        }
    }
}