elasticsearch 我想将Elasticsearch中的重复值合并为一个,并使用不同的过滤器查看结果,elasticsearch,filter,distinct,elasticsearch,Filter,Distinct" /> elasticsearch 我想将Elasticsearch中的重复值合并为一个,并使用不同的过滤器查看结果,elasticsearch,filter,distinct,elasticsearch,Filter,Distinct" />

elasticsearch 我想将Elasticsearch中的重复值合并为一个,并使用不同的过滤器查看结果

elasticsearch 我想将Elasticsearch中的重复值合并为一个,并使用不同的过滤器查看结果,elasticsearch,filter,distinct,elasticsearch,Filter,Distinct,我通过弹性搜索收集日志。日志收集如下 ex. { "name" : "John" "team" : "IT" "startTime" : "21:00" "result" : "pass" }, { "name" : "James" "team" : "HR"

我通过弹性搜索收集日志。日志收集如下

ex.
{
"name" : "John"
"team" : "IT"
"startTime" : "21:00"
"result" : "pass"
},
{
"name" : "James"
"team" : "HR"
"startTime" : "21:04"
"result" : "pass"
},
{
"name" : "Paul"
"team" : "IT"
"startTime" : "21:05"
"result" : "pass"
},
{
"name" : "Jackson"
"team" : "Marketing"
"startTime" : "21:30"
"result" : "fail"
},
{
"name" : "John"
"team" : "IT"
"startTime" : "21:41"
"result" : "pass"
},

.....and so on
如果对这些收集的日志运行下面的查询

GET logData/_search
{
  "size": 0, 
  "aggs": {
    "Documents_per_team": {
      "terms": {
        "field": "team"
      }
    }
  }
}
将公开以下结果

"aggregations" : {
    "Documents_per_team" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "IT",
          "doc_count" : 70
        },
        {
          "key" : "Marketing",
          "doc_count" : 55
        },
        {
          "key" : "HR",
          "doc_count" : 11
         }
      ]
    }
  }
}
我想要的是,如果文档的名称在此结果中重复,则消除重复

[现状]

  • 如上图所示,IT团队数量为70
[我想要的结果]

  • 如果John表演了50次,Kate表演了10次,Paul表演了10次,那么IT团队的计数3就暴露了。(因为有三名IT团队成员)
在删除重复项后,我是否可以获得一组一组的结果


谢谢你有两个选择:

  • 子聚合(简单,但不具有很强的可扩展性,尽管仅在非常特定/高级的情况下)
  • 或聚合(较慢、更详细但准确)
  • 这两种方法都假设
    名称
    s在每个团队级别都是唯一的。如果他们没有,你就需要。此外,假设
    名称
    映射为
    关键字
    类型,就像
    团队
    一样。如果没有,您需要将它们替换为
    您的_字段。关键字

    1.基数 2.脚本度量
    注意:如果您还希望看到基础部门与名称的细分,您可以修改
    组合脚本
    以返回整个状态,即
    返回状态
    ,您有两个选项:

  • 子聚合(简单,但不具有很强的可扩展性,尽管仅在非常特定/高级的情况下)
  • 或聚合(较慢、更详细但准确)
  • 这两种方法都假设
    名称
    s在每个团队级别都是唯一的。如果他们没有,你就需要。此外,假设
    名称
    映射为
    关键字
    类型,就像
    团队
    一样。如果没有,您需要将它们替换为
    您的_字段。关键字

    1.基数 2.脚本度量 注意:如果您还希望看到基础部门与名称的细分,您可以修改
    合并脚本
    以返回整个状态,即
    返回状态

    {
      "size": 0,
      "aggs": {
        "Documents_per_team": {
          "terms": {
            "field": "team"
          },
          "aggs": {
            "unique_names_per_team": {
              "cardinality": {
                "field": "name"
              }
            }
          }
        }
      }
    }
    
    {
      "size": 0,
      "aggs": {
        "Documents_per_team": {
          "scripted_metric": {
            "init_script": "state.by_department = [:]; state.dept_vs_name = [:];",
            "map_script": """
              def dept = doc['team'].value;
              def name = doc['name'].value;
              
              def name_already_considered = state.by_department.containsKey(dept) && state.dept_vs_name[dept].containsKey(name);
              
              if (name_already_considered) {
                return;
              }
              
              if (state.by_department.containsKey(dept)) {
                state.by_department[dept] += 1;
              } else {
                state.by_department[dept] = 1
              }
              
              if (!state.dept_vs_name.containsKey(dept)) {
                // init new map & set is first member
                state.dept_vs_name[dept] = [name:true];
              } else if (!state.dept_vs_name[dept].containsKey(name)) {
                state.dept_vs_name[dept][name] = true;
              }
            """,
            "combine_script": "return state.by_department",
            "reduce_script": "return states"
          }
        }
      }
    }