你不会是程序猿吧?

es 竖表 关联查询

匿名 | 发布于2017年09月11日 | 阅读数:2813

1.建立了一个用户的索引,一个index,一个type,里面的数据是一对多关系,求关联聚合数据。
 
由于用户的特征属性,年龄,性别,爱好 等等,这类后面会给许多的特征值,是不特定的,所以没建立成一个用户一列值,而是给成了key,value 这种多列形式~
 
2. 如果单纬度的话, 比如,80后的人数, 过滤 80后,然后 通过value aggs 统计即可~
SELECT COUNT(1)  FROM  test t  WHERE t.`value` ='80后' GROUP BY  t.`value`;
 
 
{"size":0,"query":{{ "match": { "value":  "80后" } }},"aggs":{"groupBy":{"terms":{"field":"key.keyword","order":{"_count":"desc"},"size":20}}}}
 
3.现在, 如果变成多维度,比如80后 切 性别为F 的用户的人数~~  所以现在要关联用户号 usr_id~ 才能判断同时满足这个条件~ 
 
mysql 也可以写出这种~ 
 
SELECT COUNT(1)  FROM 
(SELECT  user_id ,KEY , VALUE  FROM  test  WHERE  VALUE='F' )  a 
INNER JOIN 
(SELECT  user_id,KEY,VALUE FROM  test  WHERE  VALUE ='80后')  b    ON   a.user_id = b.user_id;
 
请问es 中这种 有没有类似的语法?跪谢 大神指教~
 
QQ图片20170911102546.png
已邀请:

Cheetah

赞同来自: byyuyi

有比较多的选择,提供一种,数组结构,以user_id作为一条记录,这条记录中保护一个对象,这个对象就包含了key,value,索引如下:{
  "userid" : "1",
  "user" : [
    {
      "key" : "genner",
      "value" :  "F"
    },
    {
      "key1" : "age",
      "value1" :  "90后"
    }
  ]
}

查询如下:
"query": {
    "bool": {
      "must": [
        { "match": { "user.value": "F" }},
        { "match": { "user.value1":  "90后"" }}
      ]          
    }                                           
  }         
 
如果还想分离的话,还可以采用nested或者父子结构,不过上述结构已经满足你的需求
 

要回复问题请先登录注册