在 BaseCNPJ 中,您开始输入一家企业的名称,建议便会即时出现——而这背后是一个超过 6200 万家机构的数据库。从使用者的角度看似乎稀松平常;从工程的角度看,这是一个经典的公共数据索引与归一化问题。以下是 Meta Dados 的解决方案概要。
挑战:在 6200 万条记录上实现自动补全
“边输入边搜索”(as-you-type)必须在数十毫秒内响应,否则建议还没出现,用户就已经按下了下一个键。若在一张 6200 万行的表上用带通配符的 LIKE 来实现,注定会缓慢:每按一个键都要扫描整个数据库。
面向前缀搜索的索引
出路在于为搜索预先准备数据,而不是在原始数据中检索。我们维护一层针对前缀匹配与词项匹配优化的索引,建立在已归一化的企业名称与商号之上。用户触发的查询命中的是这层索引——它小巧且专为此而设——而非整张事务表。
归一化:联邦税务局的数据是脏的
巴西联邦税务局(Receita Federal)的开放数据在到手时带有不一致的重音符号、大小写混乱、缩写和噪声。在建立索引之前,我们先做归一化:去除重音、统一大小写、处理常见词项。正是这道归一化,让“padaria sao joao”能够匹配到“PADARIA SÃO JOÃO LTDA”,而用户无需在意自己是怎么输入的。
按精确地址进行地理定位
这里就是少有人具备的差异化优势:我们不止步于市镇一级。一个自研的、在专用服务器上自托管的地理编码器,会将完整的登记地址解析为坐标(经度/纬度),并按实体缓存。目前已有超过 2750 万个已地理定位的点,覆盖可地理编码人口的 99.7%——余下的是注册于境外的企业,已被明确标注并加以限定,而非被忽略。这真正实现了按邻近度与半径查询、行业密度分析和区域覆盖分析——而不是以城市中心作近似。
时效性:随联邦税务局每个周期重建索引
联邦税务局按月度周期发布数据。每个周期,数据库都会被重新处理,索引也随之重建——上线前会进行完整性校验。而 Metabase 则按客户跟踪搜索与 API 自身的使用情况,闭合了工程与业务之间的循环。
常见问题
如何在用户输入时推荐企业,同时又不给数据库带来过重负担?
关键在于不要每按一个键就去查询事务表。一层建立在已归一化字段之上、专为前缀匹配准备的索引,能在毫秒间响应,并将搜索与生产负载隔离开来。主数据库则得以腾出手来,专注于它最擅长的事情。
地理定位是按每家企业的精确坐标进行的吗?
是的。一个自研的、运行在专用服务器上的地理编码器,会将完整的登记地址解析为坐标(经度/纬度),并按实体缓存——超过 2750 万个点,可地理编码人口覆盖率达 99.7%。我们未能地理编码的部分(注册于境外的企业)已被明确标注并加以限定,而非被隐藏。