package main import ( qu "qfw/util" "go.mongodb.org/mongo-driver/bson/primitive" "github.com/go-ego/gse" ) //省 type Province struct { Name string Brief string Cap string Captial *City } //市 type City struct { Name string Brief string P *Province } //区或县 type District struct { Name string C *City } //街道 type Street struct { Name string D *District } //村、社区、居委会 type Community struct { Name string S *Street } //区或县简称对应的全称和市信息 type DistrictSimFull struct { SimName string FullName string C *City } //打分信息 type ScoreInfo struct { FullAreaScore map[string]float64 FullCityScore map[string]float64 FullDistrictScore map[string]float64 SimAreaScore map[string]float64 SimCityScore map[string]float64 SimDistrictScore map[string]float64 } var ( ProvinceMap map[string]string //省全称简称(key:浙江省 val:浙江) ProvinceBriefMap map[string]*Province //省简称对应的省信息(key:浙江 val:&Province{}) CityMap map[string]string //市全称简称(key:杭州市 val:杭州) CityBriefMap map[string]*City //市简称对应的市信息(key:杭州 val:&City{}) CityFullMap map[string]*City //市全称对应的市信息(key:杭州市 val:&City{}) DistrictCityMap map[string]*City // NewDistrictCityMap map[string][]*City //区或县全称对应的city(全国有相同名称的区或县,这里对应的city用slice) DistrictSimAndAll map[string]string //区或县(key:简称 val:全称) NewDistrictSimAndAll map[string][]map[string]*City //区或县(key:简称 val: 相同简称的区全称:所在市) StreetDistrictMap map[string]*District //街道对应的区或县 NewStreetDistrictMap map[string][]*District //街道全称对应的区或县 CommunityDistrictMap map[string][]*District //村、居委会对应的区或县 Trie_Full_Province *Trie //省全称 省、直辖市、自治区 Trie_Full_City *Trie //市全称 地级市 Trie_Full_District *Trie //县全称 市辖区、县(旗)、县级市、自治县(自治旗)、特区、林区 Trie_Full_Street *Trie //街道、乡镇全称 镇、乡、民族乡、县辖区、街道 Trie_Full_Community *Trie //村/委员会全称 村、居委会 Trie_Sim_Province *Trie //省简称 Trie_Sim_City *Trie //市简称 Trie_Sim_District *Trie //县简称 Trie_Fulls []*Trie //所有全称 Trie_Sims []*Trie //所有简称 Seg_SV *gse.Segmenter //分词 // Seg_PCD *gse.Segmenter //分词 ) func InitInfo() { InitVar() //初始化变量 InitSeg() //初始化分词 InitCity() //初始化城市信息 } //初始化变量 func InitVar() { defer qu.Catch() //初始化Trie //全称 Trie_Full_Province = &Trie{} Trie_Full_City = &Trie{} Trie_Full_District = &Trie{} Trie_Full_Street = &Trie{} Trie_Full_Community = &Trie{} //简称 Trie_Sim_Province = &Trie{} Trie_Sim_City = &Trie{} Trie_Sim_District = &Trie{} //初始化分词 // Seg_PCD = &gse.Segmenter{} Seg_SV = &gse.Segmenter{} //初始化map ProvinceMap = make(map[string]string) CityMap = make(map[string]string) DistrictSimAndAll = make(map[string]string) NewDistrictSimAndAll = make(map[string][]map[string]*City) CityBriefMap = make(map[string]*City) CityFullMap = make(map[string]*City) ProvinceBriefMap = make(map[string]*Province) NewDistrictCityMap = make(map[string][]*City) NewStreetDistrictMap = make(map[string][]*District) CommunityDistrictMap = make(map[string][]*District) } //初始化分词 func InitSeg() { defer qu.Catch() // Seg_PCD.LoadDict("res/pcd.txt") Seg_SV.LoadDict("res/sv.txt") } //初始化城市信息 func InitCity() { defer qu.Catch() InitCityAll() //城市全称信息 InitCitySim() //城市简称信息 Trie_Fulls = []*Trie{Trie_Full_Province, Trie_Full_City, Trie_Full_District, Trie_Full_Street, Trie_Full_Community} Trie_Sims = []*Trie{Trie_Sim_Province, Trie_Sim_City, Trie_Sim_District} } func InitCityAll() { query := map[string]interface{}{ "s_type": "cityall", "delete": false, "s_version": Version, } list, _ := MgoExt.Find(VersionColl, query, nil, nil) qu.Debug("all---", len(list)) for _, v := range list { name := qu.ObjToString(v["s_name"]) tmp := v["content"].(map[string]interface{}) //加载省信息 Trie_Full_Province.AddWords(name) //加入省全称Trie(k:浙江省) p := &Province{} p.Name = name //省全称:浙江省 p.Brief = tmp["brief"].(string) //省简称:浙江 Trie_Sim_Province.AddWords(p.Brief) //加入省简称Trie(k:浙江) ProvinceMap[name] = p.Brief //浙江省:浙江 ProvinceBriefMap[p.Brief] = p //浙江:省信息{} p.Cap = tmp["captial"].(string) //省会(杭州) //加载市信息 city, _ := tmp["city"].(map[string]interface{}) for k, v := range city { Trie_Full_City.AddWords(k) //加入市全称Trie(k:杭州市) v1m, _ := v.(map[string]interface{}) c := &City{} c.Name = k //市全称:杭州市 c.Brief = v1m["brief"].(string) //市简称:杭州 Trie_Sim_City.AddWords(c.Brief) //加入市简称Trie(k:杭州) CityMap[k] = c.Brief //杭州市:杭州 CityBriefMap[c.Brief] = c //杭州:市信息{} CityFullMap[k] = c //杭州市:市信息{} c.P = p if c.Name == p.Cap { p.Captial = c //加载province中的省会市信息{} } //区县 districtmap, _ := v1m["area"].(map[string]interface{}) //区或县 for district, streets := range districtmap { d := &District{} d.Name = district d.C = c //省直辖市,河南济源市没有区一级,目前区一级写的还是济源市 //匹配时,如果匹配到区,拿区和市比对,相同则代表是省直辖市,不要区一级 Trie_Full_District.AddWords(district) //加入区或县全称Trie ctmp := NewDistrictCityMap[district] if len(ctmp) == 0 { tmpcarr := []*City{c} NewDistrictCityMap[district] = tmpcarr } else { NewDistrictCityMap[district] = append(NewDistrictCityMap[district], c) } //街道 streetmap, _ := streets.(map[string]interface{}) for street, communitys := range streetmap { s := &Street{} s.Name = street s.D = d Trie_Full_Street.AddWords(street) //加入街道全称Trie dtmp := NewStreetDistrictMap[street] if len(dtmp) == 0 { tmpdarr := []*District{d} NewStreetDistrictMap[street] = tmpdarr } else { NewStreetDistrictMap[street] = append(NewStreetDistrictMap[street], d) } //村、居委会 for _, ct_tmp := range communitys.(primitive.A) { ct := qu.ObjToString(ct_tmp) Trie_Full_Community.AddWords(ct) //加入居委会、村全称Trie cttmp := CommunityDistrictMap[ct] if len(cttmp) == 0 { tmpdarr := []*District{d} CommunityDistrictMap[ct] = tmpdarr } else { CommunityDistrictMap[ct] = append(CommunityDistrictMap[ct], d) } } } } } } } func InitCitySim() { defer qu.Catch() query := map[string]interface{}{ "s_type": "citysim", "delete": false, "s_version": Version, } list, _ := MgoExt.Find(VersionColl, query, nil, nil) qu.Debug("sim---", len(list)) for _, v := range list { tmp := v["content"].(map[string]interface{}) city, _ := tmp["city"].(map[string]interface{}) for _, v1 := range city { v1m, _ := v1.(map[string]interface{}) cb := v1m["brief"].(string) //市简称 arr := v1m["area"].(map[string]interface{}) //区或县简称 for districtsim, districtall := range arr { dfullstr, _ := districtall.(string) Trie_Sim_District.AddWords(districtsim) //加入区或县简称Trie c := CityBriefMap[cb] dfullarr := NewDistrictSimAndAll[districtsim] dfullcity := map[string]*City{dfullstr: c} if len(dfullarr) == 0 { tmparr := []map[string]*City{dfullcity} NewDistrictSimAndAll[districtsim] = tmparr } else { NewDistrictSimAndAll[districtsim] = append(NewDistrictSimAndAll[districtsim], dfullcity) } } } } }