我有一个字符串数据库(任意长度),它拥有超过一百万个项目(可能更多)。
我需要将用户提供的字符串与整个数据库进行比较,并检索相同的字符串(如果存在)或以其他方式返回最接近的模糊匹配(60%相似度或更高)。理想情况下,搜索时间应小于一秒。
我的想法是使用编辑距离将每个数据库字符串与搜索字符串进行比较,然后根据数据库的长度缩小数据库中的候选项。
但是,由于我需要经常执行此操作,我正在考虑构建db字符串的索引以保留在内存中并查询索引,而不是直接查询db。
有关如何以不同方式解决此问题或如何构建内存中索引的任何想法?
答案 0 :(得分:5)
This paper seems to describe exactly what you want.
Lucene(http://lucene.apache.org/)也实现了Levenshtein编辑距离。
答案 1 :(得分:2)
您没有提及您的数据库系统,但对于PostrgreSQL,您可以使用以下contrib模块:trgm - Trigram matching for PostgreSQL
pg_trgm contrib模块提供函数和索引类,用于根据trigram匹配确定文本的相似性。
答案 2 :(得分:1)
如果您的数据库支持它,您应该使用全文搜索。否则,您可以使用像lucene这样的索引器及其各种实现。
答案 3 :(得分:0)
由于数据量很大,当插入记录时,我会计算并将语音算法的值存储在索引列中,然后在该列的范围内约束(WHERE子句)我的选择查询。
答案 4 :(得分:0)
计算SOUNDEX哈希(内置于许多SQL数据库引擎中)并通过它进行索引。
SOUNDEX是基于单词声音的散列,因此同一单词的拼写错误可能具有相同的SOUNDEX散列。
然后找到搜索字符串的SOUNDEX哈希,并匹配它。
答案 5 :(得分:0)
关于相关算法的非常广泛的解释在书中字符串,树和序列算法:计算机科学和计算生物学出自Dan Gusfield。
答案 6 :(得分:0)
https://en.wikipedia.org/wiki/Levenshtein_distance
Levenshtein算法已在某些DBMS中实现
(例如PostgreSql:http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html)