mysql 一对多关系同步到es,刚好es需要的是一个字段对应逗号分割的值。这样就解决了mysql多表关联查询很慢的弊端。但是es中给如何把逗号分割的字符串做为查询条件呢,答案如下:先看一个简单的例子:
添加一个逗号分词
PUT info-flow-test4
{
"settings": {
"analysis": {
"analyzer": {
"my_anal": {
"type": "pattern",
"pattern": ","
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"content_id": {
"type": "long"
},
"content_type": {
"type": "integer"
},
"tags": {
"type": "text",
"analyzer": "my_anal"
}
}
}
}
添加一个文档
POST /info-flow-test4/_doc
{
"tags": "1,2,33"
}
POST /info-flow-test4/_search
{
"query": {
"match": {
"tags": "2"
}
}
}
返回结果:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "info-flow-test4",
"_type" : "_doc",
"_id" : "MUFNDX8BciPKIrWg9Qc6",
"_score" : 0.2876821,
"_source" : {
"tags" : "1,2,33"
}
}
]
}
}
以上就是逗号分割的字段如何在es中检索出来。
项目中实战:通过canaladapter 同步一对多的关系到es, canaladapter配置文件如下:
dataSourceKey: defaultDS
destination: canalserver
outerAdapterKey: essync
groupId: g1
esMapping:
_index: wx_cp_user_contact_rel_all
_id: id
# upsert: true
# pk: id
sql: "select
CONCAT(a.corp_id, '_', a.follow_user_id, '_', a.external_userid) as id,
a.external_userid,
a.follow_user_id,
a.follow_user_remark,
a.follow_user_description ,
date_format( a.follow_user_createtime, '%Y-%m-%d %H:%I:%S') as follow_user_createtime,
a.follow_user_tags_group_name,
a.follow_user_tags_tag_name ,
a.follow_user_tags_type ,
a.follow_user_remark_corp_name ,
a.address,
a.corp_id ,
a.follow_user_remark_mobiles ,
a.follow_user_state ,
a.status ,
a. birthday,
date_format( a.link_time, '%Y-%m-%d %H:%I:%S') as link_time,
date_format( a.create_time, '%Y-%m-%d %H:%I:%S') as create_time,
a.follow_user_add_way,
b.name,
b.avatar,
b.type,
b.gender,
b.unionid,
b.position,
b.corp_name ,
b.corp_full_name,
b.external_profile,
b.phone,
d.broadband_umber,
e.mobile,
f.tags
from
wx_cp_user_contact_rel a
left join wx_cp_user_contact b on a.external_userid = b.external_userid and a.corp_id = b.corp_id
left join wx_cp_user_contact_ext_rel d on a.external_userid = d.external_userid and a.follow_user_id = d.user_id and a.corp_id = d.corp_id
left join wx_cp_user e on e.user_id = a.follow_user_id and e.corp_id = a.corp_id
left join (select ec_user_id ,user_id , GROUP_CONCAT(tag_id) as tags,corp_id from wx_cp_user_contact_tag_rel group by ec_user_id,user_id,corp_id) f on a.external_userid = f.ec_user_id and a.follow_user_id = f.user_id and a.corp_id = f.corp_id
"
# objFields:
# _labels: array:;
etlCondition: "where a.corp_id ={}"
commitBatch: 3000
es索引建立:
PUT wx_cp_user_contact_rel_all/
{
"settings": {
"analysis": {
"analyzer": {
"my_anal": {
"type": "pattern",
"pattern": ","
}
}
}
},
"mappings" : {
"properties" : {
"address" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"avatar" : {
"type" : "keyword"
},
"birthday" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"broadband_umber" : {
"type" : "keyword"
},
"corp_full_name" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"corp_id" : {
"type" : "keyword"
},
"corp_name" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"create_time" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"develop_phone" : {
"type" : "keyword"
},
"external_profile" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"external_userid" : {
"type" : "keyword"
},
"follow_user_add_way" : {
"type" : "keyword"
},
"follow_user_createtime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"follow_user_description" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"follow_user_id" : {
"type" : "keyword"
},
"follow_user_remark" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"follow_user_remark_corp_name" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"follow_user_remark_iop_mobiles" : {
"type" : "keyword"
},
"follow_user_remark_mobiles" : {
"type" : "keyword"
},
"follow_user_state" : {
"type" : "keyword"
},
"follow_user_tags_group_name" : {
"type" : "keyword"
},
"follow_user_tags_tag_name" : {
"type" : "keyword"
},
"follow_user_tags_type" : {
"type" : "keyword"
},
"gender" : {
"type" : "integer"
},
"is_has_tag" : {
"type" : "integer"
},
"job_number" : {
"type" : "keyword"
},
"link_time" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"mobile_update_time" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"name" : {
"type" : "keyword"
},
"phone" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"position" : {
"type" : "keyword"
},
"status" : {
"type" : "short"
},
"type" : {
"type" : "integer"
},
"unionid" : {
"type" : "keyword"
},
"unionid_mobile" : {
"type" : "keyword"
},
"update_time" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.S||strict_date_optional_time||epoch_millis"
},
"user_code" : {
"type" : "keyword"
},
"mobile" : {
"type" : "keyword"
},
"tags": {
"type": "text",
"analyzer": "my_anal"
}
}
}
}
项目中 员工给客户大的标签,是一对多的关系,但是为了在es中能对标签做完检索条件。不得已才有此方案,重点关注上次 tags 字段(完结)