使用Elasticsearch的Java-API实现SQL的group by查询

上一篇我们总结了如何将MySQL的数据实时同步到Elasticsearch中,这一篇我们来总结一下当数据同步到Elasticsearch中后,如何使用Java API对Elasticsearch进行复杂查询,但实际工作中还没有遇到过特别复杂的SQL如何转化到Elasticsearch中,当然遇到这种情况一种解决方式是将数据库的查询结果直接存到一张表中,然后在Elasticsearch建立对应的索引,再对该索引进行查询;当然更直接的就是编写复杂的Java代码实现查询,这种情况我也还没有遇到。

前面我们已经讲过了如何将MySQL数据库的一张表映射到Elasticsearch的索引中,同时不建议多张表对应同一个索引,Elasticsearch本身现在也不支持一个index下存在多个type的情况,因此一张表对应一个index是目前主要的方式。但开发过程中还会经常遇到表对应的索引经常需要调整的问题,因为不同的查询过滤条件不同,每个字段的设置就会不同,因此会需要反复调整索引,下面我们讲一个我实际做过的SQL语句的转化。

在工作中遇到过group by两个字段,并且进行分组求和的情况,SQL语句如下:

select t.DAINFOATTR15, sum(t.DAINFOATTR19), t.DAINFOATTR17
from t_da_info t
group by t.DAINFOATTR15, t.DAINFOATTR17;

可以看到这是一个非常简单的SQL语句,但在Elasticsearch中进行查询时会发现许多问题,首先我们的表中出现了DAINFOATTR15这个字段存的全部都是中文,然后在使用Java API的时候,Elasticserach会将DAINFOATTR15字段的每一个中文都进行group by,也就是每个独立的中文字符都会被group by,一开始遇到这个问题的时候就会很懵,后来通过百度查找结局方案,需要将存放中文的字段设置为keyword,如下:

"DAINFOATTR15": {
   
   
  "type": "text",
  "fielddata": true,
  "fields": {
   
   
    "keyword": {
   
   
      "type": "keyword"
    }
  }
}

我将完整的建立索引的语句展示出来,可以看到凡是加了如上的keyword过滤的,都是后面查询中需要作为group by的字段:

PUT daac0118_da_info
{
   
   
  "mappings": {
   
   
    "da_info": {
   
   
      "properties": {
   
   
        "DAINFOCODE": {
   
   
          "type": "text"
        },
        "DAINFONAME": {
   
   
          "type": "text"
        },
        "DADIRCODE": {
   
   
          "type": "text"
        },
        "DAINFOTYPE": {
   
   
          "type": "text"
        },
        "DAINFOFLAG": {
   
   
          "type": "text"
        },
        "DACOMPID": {
   
   
          "type": "text"
        },
        "DAVERSION": {
   
   
          "type": "text"
        },
        "DAINFOATTR1": {
   
   
          "type": "text"
        },
        "DAINFOATTR2": {
   
   
          "type": "text"
        },
        "DAINFOATTR3": {
   
   
          "type": "text"
        },
        "DAINFOATTR4": {
   
   
          "type": "text"
        },
        "DAINFOATTR5": {
   
   
          "type": "text"
        },
        "DAINFOATTR6": {
   
   
          "type": "text"
        },
        "DAINFOATTR7": {
   
   
          "type": "text"
        },
        "DAINFOATTR8": {
   
   
          "type": "text"
        },
        "DAINFOATTR9": {
   
   
          "type": "text"
        },
        "DAINFOATTR10": {
   
   
          "type": "text"
        },
        "DAINFOATTR11": {
   
   
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "DAINFOATTR12": {
   
   
          "type": "text"
        },
        "DAINFOATTR13": {
   
   
          "type": "text",
          "fielddata": true,
          "fields": {
   
   
            "keyword": {
   
   
              "type": "keyword"
            }
          }
        },
        "DAINFOATTR14": {
   
   
          "type": "text"
        },
        "DAINFOATTR15": {
   
   
          "type": "text",
          "fielddata": true,
          "fields": {
   
   
            "keyword": {
   
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当一艘船沉入海底8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值