
存量数据库 记录 ID 姓名(%50 ) 性别( 10%) 手机号( 20%) 籍贯(%10 ) 电子邮箱( 10%) 1 张三 女 13800001111 山西太原 [email protected] 2 张三 男 13800001111 山西太原 [email protected] 3 李四 男 15611112345 湖南长沙 [email protected] 4 王五 男 17022220000 广东广州 [email protected]
新增记录 5 李四 女 15611112345 广西桂林 [email protected]
需求是新增记录时做相似性匹配: 规则如下 相似性=(李四==李四)*50% + (男==女)10%+(15611112345==15611112345)20%+(湖南长沙==广西桂林)10%+([email protected][email protected])10%= 150% + 010% + 120% + 0%10% + 110% = 80% >=80% 按照规则,各字段加权计算,阈值设为 80%时,表示记录 5 和记录 3 是相似的。
存在问题: 现在问题是存量记录表有上“千万”记录,每次新添加记录时需要与存量的记录进行相似度匹配,但是每次都遍历扫描数据库效率太低。 请问有没有什么好的方式 /算法?或者使用其他数据结构代替关系数据库进行记录存储?使得匹配时间控制在 1 分钟级别左右。
1 forkme OP |
2 mpich Dec 4, 2017 ES ? |
5 gamexg Dec 4, 2017 @forkme #3 es 指的是 Elasticsearch。 看需求怎么和之前的一个做小货的帖子需求类是,他的只要求匹配相识的通信录。 但是仔细看了下需求,没什么难度吧? 给姓名做索引,然后第一个筛选掉姓名,只要姓名不符合怎么也不可能达到 80%。 另外重名的数据量应该不大,之后直接遍历吧。 如果数据库压力大上个 kv 储存来保存姓名。 |
6 zhengxiaowai Dec 4, 2017 ES 太重 千万的数据量不需要要用到,而且学习曲线不友好。 推荐使用 pg 的 ts_query 可以设置 rank,效率也不错,挺好上手的 |
7 ytmsdy Dec 4, 2017 上个 SSD 试试看。。 |
9 lkjkkk Dec 4, 2017 via iPhone 分区表? |
10 BadCat Dec 4, 2017 分区呀,可以先分区,然后再索引 效率会高很多 |
11 diginWu Dec 4, 2017 2G 不到的数据难道不能内存搞? |
12 forkme OP |
14 zhx1991 Dec 4, 2017 用 es |
15 noNOno Dec 4, 2017 分区索引,处理大文本数据用全文索引 |
16 ryd994 Dec 5, 2017 via Android 你这算法有问题,添加一条扫一次全表 放队列,晚上批量处理 其次,可以对几个高分项先用索引过滤 如果高分项不匹配,那可以扔到后面批次,用更大的批量,更低的频率去扫 |