2017-06-06 109 views
1

骨料我在下面的类型ElasticSearch - 查询过滤和嵌套对象长期

"_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,但它只能返回活动用户的名称。

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

回答

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

谢谢一个详细的回应。在我当前的设置中实现并不容易,并且引发了另一个问题,这里我详细介绍了这个问题:https://stackoverflow.com/questions/44423284/logstash-split-incoming-nested-message-into-a-parent-儿童模式 – Fizi