首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elasticsearch:从调查数据生成分布表

Elasticsearch:从调查数据生成分布表
EN

Stack Overflow用户
提问于 2016-04-05 23:26:58
回答 1查看 153关注 0票数 4

我像这样存储调查数据:

代码语言:javascript
运行
复制
[  
  {  
    "userid":1,
    "answers":[  
      {  
        "key":"gender",
        "value":"male"
      },
      {  
        "key":"color",
        "value":"red"
      },
      {  
        "key":"vehicle",
        "value":"car"
      }
    ]
  },
  {  
    "userid":2,
    "answers":[  
      {  
        "key":"gender",
        "value":"female"
      },
      {  
        "key":"color",
        "value":"blue"
      },
      {  
        "key":"vehicle",
        "value":"bike"
      }
    ]
  },
  ......
]

映射如下:

代码语言:javascript
运行
复制
"users" : {
    "properties" : {
        "userid" : {
            "type" : "long"
        },
        "answers" : {
            "type" : "nested",
            "properties" : {
                "key" : {
                    "type" : "string",
                    "index" : "not_analyzed"
                },
                "value" : {
                    "type" : "string",
                    "index" : "not_analyzed"
                }
            }
        }
    }
}

这意味着很多用户对不同的问题有很多答案。我必须灵活处理被问到的问题,所以我选择了键/值样式。

现在我想找到一个查询,它将给我一个关于性别和颜色的分布表。这意味着:一个二维表,以性别为轴,以颜色为轴,向我显示这些领域中所有可能的术语。我想要有一个很好的概述,有多少女人喜欢红色,有多少男人喜欢蓝色等等。

我尝试了很多嵌套过滤的术语聚合,但还没有成功。

任何关于如何构建聚合查询的提示都将不胜感激……

EN

Stack Overflow用户

发布于 2016-04-06 04:15:32

你可以查看scripted metric aggregation

一般来说,它看起来是这样的:

代码语言:javascript
运行
复制
POST documents/_search
{
  "aggs": {
    "distribution": {
      "scripted_metric": {
        "init_script": "initializations",
        "map_script": "build partial distribution for single document",
        "combine_script": "",
        "reduce_script": "summarize all partial distributions to final grid"
      }
    }
  }
}

对于您的特定情况,我可以建议以下查询

代码语言:javascript
运行
复制
POST test/example/_search
{
  "size": 0, 
  "aggs": {
    "distribution": {
      "scripted_metric": {
                "init_script" : "_agg['variants'] = [:]",
                "map_script" : "gender='';color=''; for (answer in _source.answers){ if(answer.key=='gender'){gender=answer.value};if(answer.key=='color'){color=answer.value}  }; if(gender!='' && color!=''){key=(gender+'-'+color); _agg['variants'][key]=_agg['variants'].get(key,0)+1}", 
                "combine_script" : "return _agg.variants",
                "reduce_script" : "result=[:]; for (a in _aggs) {a.each{k,v -> result[k]=result.get(k,0)+v} }; return result;"
            }
    }
  }
}

它将返回如下所示的内容

代码语言:javascript
运行
复制
{
  "took": 32,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 7,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "distribution": {
      "value": {
        "female-yelow": 4,
        "male-red": 1,
        "female-blue": 1,
        "male-blue": 1
      }
    }
  }
}

确保您的服务器配置中有scripting enabled

代码语言:javascript
运行
复制
user:/etc/elasticsearch# head elasticsearch.yml 
script.inline: true
script.indexed: true
...
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36430682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档