我有两张表:A,B 结构都是 ID NAME
我想找出A表的NAME跟B表的哪个NAME相似度最高 展示出来
比如查询结果如下:
A.NAME B.NAME SIMILARITY
A A 100
B B1 50
我的思路是将两张表CROSS 后调用相似度对比函数 完了取出相似度最高的
但是当两张表都是10W条数据的时候 交叉后将会是100亿条数据,根本短时间内无法完成计算,
各位大神有没有什么好办法?
找国家申请专项科研基金,再找100个数学家,闭门研究个几十年总能有办法吧,到时候说不定量子计算机就有了。
可以发展10W个好心人,每人分配一个AName和一个BName。每个人都通过P2P网络寻找与当前ANAME最相似的BNAME。如果好心人爬遍了P2P网络,就将结果返回给中心服务器。(滑稽
为什么要一次性取出来了?用逻辑去控制 分批次取值。ID 主键 Name 全文索引。用 CONTAINS 匹配就行了。
已找到10万人
个人愚见,遇到数据较多相似比对的情况,最好是再建第三张表。比对的时机一般可以放在,新增、修改数据的时候进行。一次性比对这么多数据确实不太靠谱。纯粹的对比总不能依赖你的语句查询。这个可以选择适合的容器。分批次取得数据,利用像LIST,字典,等等进行匹配对比,存入第三张表。目前我能想到的只有这些。另外你的这个思路"将两张表CROSS 后"。- -就这个所消耗掉的时间估计就很长了。还是分批处理吧!
这个不是那么简单的
你相似度是怎么定义的?
我觉得,先把NAME和ID拿到内存里,20W数据也不多。然后你自己定义一个规则把NAME上某种值的数据分类,比如张开头的分一类,长度大于10的分一类之类的,根据你自己的需要。也就两遍内存里循环。等数据分小了,你再在两个表分的同一类里去用相似度算法找。(其实同一类本身就是一种相似度匹配规则,关键是个模糊度的问题,几次比较模糊的分类就可以把数据变得很少,精确度也不影响)
放到同一个表里面。order by,
楼主,你这种需求可以看下lucene.net,配合盘古分词,应该能达到你的效果,但是,前提是录入数据库的时候,你先做好分词之后再插入,然后通过数据库索引去查询,10W真不是什么大数据...