首页 文章

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

提问于
浏览
1

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

"_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的所有活动用户 . 例如:我想获得id为 1008 的用户,在这种情况下是用户 XYZ

  • 获取所有活跃用户 . 例如:我执行match_all查询,我想在术语 USER.NAME 上聚合,但它应该只返回活动用户的名字 .

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

1 回答

  • 0

    因为您总是对提取用户感兴趣,所以在这种情况下parent-child关系将比用户的嵌套文档类型做得更好 . 与嵌套类型一样,响应将具有不必要的有效负载,其中inner_hits用于弹性 .

    由于为嵌套关联提供了更好的导航和更灵活的查询,然后是嵌套类型 .

    同样在映射中,您可能必须选择类型为 keyword 或创建自定义分析器以保留案例,因为您搜索的是区分大小写的搜索 .

    Mappings for parent-child relationship

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

    Index parent child documents

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

    Query

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

相关问题