【问题标题】:How to get the average count of missing field per document with Elasticsearch?如何使用 Elasticsearch 获取每个文档的平均缺失字段数?
【发布时间】:2018-03-30 04:58:42
【问题描述】:

简而言之:使用 Elasticsearch,给定一个字段列表,我如何才能将每个文档的平均缺失字段数作为聚合?

详情

使用missing 聚合类型,我可以获得缺少给定字段的文档总数。所以有了以下数据:

"hits": [{
    "name": "A name",
    "nickname": "A nickname",
    "bestfriend": "A friend",
    "hobby": "An hobby"
},{
    "name": "A name",
    "hobby": "An hobby"
},{
    "name": "A name",
    "nickname": "A nickname",
    "hobby": "An hobby"
},{
    "name": "A name",
    "bestfriend": "A friend"
}]

我可以运行以下查询:

{
    "aggs": {
        "name_missing": {
            "missing": {"field": "name"}
        },
        "nickname_missing": {
            "missing": {"field": "nickname"}
        },
        "hobby_missing": {
            "missing": {"field": "hobby"}
        },
        "bestfriend_missing": {
            "missing": {"field": "bestfriend"}
        }
    }
}

我得到以下聚合:

...
"aggregations": {
    "name_missing": {
        "doc_count": 0
    },
    "nickname_missing": {
        "doc_count": 2
    },
    "hobby_missing": {
        "doc_count": 1
    },
    "bestfriend_missing": {
        "doc_count": 1
    }   
}
...

我现在需要的是获取每个文档的缺失字段的平均数。我可以通过代码对结果进行数学运算:

  • 总结所有missing聚合doc_count
  • 除以总点击次数

但是,如何从 Elasticsearch 中获得与聚合相同的结果?

感谢您的任何回复/建议。

【问题讨论】:

  • 分享你的 ES 查询。
  • @HatimStovewala 问题已更新。谢谢!

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

这是一个丑陋的解决方案,但可以解决问题。

GET missing/missing/_search
{
  "size": 0,
  "aggs": {
    "result": {
      "terms": {
        "script": "'aaa'"
      },
      "aggs": {
        "name_missing": {
          "missing": {
            "field": "name"
          }
        },
        "nickname_missing": {
          "missing": {
            "field": "nickname"
          }
        },
        "hobby_missing": {
          "missing": {
            "field": "hobby"
          }
        },
        "bestfriend_missing": {
          "missing": {
            "field": "bestfriend"
          }
        },
        "avg_missing": {
          "bucket_script": {
            "buckets_path": {            // This is kind of defining variables. name_missing._count will take the doc_count of the name_missing aggregation and same for others(nickname_missing,hobby_missing,bestfriend_missing) as well. "count":"_count" will take doc_count of the documents on which aggregation is performed(total no. of Hits).
              "name_missing": "name_missing._count",
              "nickname_missing": "nickname_missing._count",
              "hobby_missing": "hobby_missing._count",
              "bestfriend_missing": "bestfriend_missing._count",
              "count":"_count"
            },
            "script": "(name_missing+nickname_missing+hobby_missing+bestfriend_missing)/count" // Here we are adding all the missing values and dividing it by the total no. of Hits as you require.
          }
        }
      }
    }
  }
}

我已经向你展示了如何做到这一点,现在由你来决定如何调整你的参数并提取你想要的。

【讨论】:

  • 您介意解释一下您的解决方案,以帮助我(和其他人)的知识吗?这肯定会提高你的答案的质量。谢谢。
  • 当然我会解释,但首先我的解决方案对你有用吗?
  • 很遗憾没有。使用 Elasticsearch 2.4.6 我得到: "caused_by": { "type": "script_exception", "reason": "failed to run inline script [return (params.name_missing+params.nickname_missing+params.hobby_missing+params.bestfriend_missing) /params.count] using lang [groovy]", "caused_by": { "type": "missing_property_exception", "reason": "No such property: params for class: 94f49c62d81679c04fe32fb7c3807e8e60d57be1" } }
  • 我已经更新了我的答案。现在看看这是否适合你。我已经在 ES 5.6.2 上对其进行了测试,它对我有用。
  • 如果我从字段定义中删除 .keyword 部分,它会起作用。谢谢你。为了使您的答案更有用,我建议添加一些解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2015-05-06
  • 2020-01-15
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多