上一篇我们总结了如何将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": {


828

被折叠的 条评论
为什么被折叠?



