基于非文字比较的快速搜索方式
我正在开发一个针对相当大的数据集的小搜索,基本上所有字符串。表字段之间的关系很简单,但比较不能是文字。即它应该能够关联“filippo”,“philippo”,“filipo”等等。
我找到了一些可以做到的方法,经常在Levinstein距离上遇到绊脚(this,here和here),虽然我不确定它是否可行具体案例。
简而言之,我有两个表,一个带有“搜索键”的小表和一个应该执行搜索的更大表。两个表都具有相同的字段,它们都具有相同的“含义”。 E.g。
KEYS_TABLE
# | NAME | MIDNAME | SURNAME | ADDRESS | PHONE
1 | John | Fake | Doe | Sesame St. | 333-12-32
2 | Ralph | Stue | Michel | Bart. Ghost St. | 778-13000
...
和
SEARCH_TABLE
# | NAME | MIDNAME | SURNAME | ADDRESS | PHONE
...
532 | Jhon | F. | Doe | Sesame Street | 3331232
...
999 | Richard | Dalas | Doe | Sesame St. | 333-12-32
我想要做的就是获取KEYS_TABLE
上每个给定记录的某种指标或排名,报告SEARCH_TABLE
以上某个相关性的所有记录(由指标或简单定义)一些“KNN”之类的方法)。
我说Levinstein距离可能不实用,因为它需要计算KEYS_TABLE
x SEARCH_TABLE
中每一行的每个字段。考虑到SEARCH_TABLE
有大约4亿条记录且KEYS_TABLE
从10万到1密耳不等,结果数字太大了。
我希望以前可以通过某种方式丰富两种表格,或者使用更简单(更便宜)的方式来执行搜索。
值得一提的是,我可以随意转换数据。例如将St.
标准化为st
,将Street
标准化为st
,删除特殊字符,依此类推。
我的选择是什么?
答案 0 :(得分:0)
我能想到的一种方法(启发式!)是:
除了表格中的原始字段外,每个字段还存储由某些stemming算法获得的规范化格式。如果您使用的是java,那么lucene的EnglishAnalyzer
可能会帮助您完成此步骤。
使用标准方法进行精确比较,为table1
候选人列表中的每个条目查找。 e2
中的条目table2
将成为e1
中table1
条目的候选条件,如果它们具有标准格式与常规格式匹配的公共字段。这可以通过一些允许快速字符串搜索的数据结构有效地完成 - 有很多这些。
对于e1
中的每个条目 - 使用您选择的精确指标(例如建议的leneshtein距离)在列表中找到它的“最佳”候选者
您可能希望进行一些后期处理,以确保table1
中没有两个元素映射到table2
中的同一元素,如果这是一个问题。
答案 1 :(得分:0)
根据可能出现的拼写错误,您可以使用Soundex或Metaphone进行搜索。