ElasticSearch - 查询过滤和嵌套对象长期
问题描述:
骨料我在下面的类型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
,但它只能返回活动用户的名称。
我在执行这些嵌套操作时遇到问题,因为搜索活动状态将返回一个记录,即使其中一个用户处于活动状态。我无法专门筛选非活动用户。任何在这方面的帮助,非常感谢。
答
由于您一直对提取用户感兴趣,因此在这种情况下,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
}
}
}
}
}
}
谢谢一个详细的回应。在我当前的设置中实现并不容易,并且引发了另一个问题,这里我详细介绍了这个问题:https://stackoverflow.com/questions/44423284/logstash-split-incoming-nested-message-into-a-parent-儿童模式 – Fizi