【问题标题】:ElasticSearch - Query to filter and aggregate on nested object termElasticSearch - 查询以过滤和聚合嵌套对象术语
【发布时间】:2017-06-07 17:13:59
【问题描述】:

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

 "_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 上进行聚合,但它应该只返回活跃用户的名称。

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

【问题讨论】:

    标签: elasticsearch nested


    【解决方案1】:

    既然您总是对获取用户感兴趣,那么在这种情况下,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
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2018-01-30
    • 2014-12-31
    • 2023-03-28
    • 2018-06-17
    相关资源
    最近更新 更多