Jos*_*ris 10 sql sql-server algorithm database-design data-structures
我试图确定在数据库中查找名字变体的最佳方法.例如,我搜索比尔史密斯.显然,我希望它回归"比尔史密斯",但我还希望它能归还"威廉史密斯",或"比利史密斯",甚至"威利史密斯".我最初的想法是建立一个名字层次结构,但我不知道在哪里可以获得这样的数据,如果它甚至存在的话.
由于用户可以搜索目录,我认为这将是一个关键功能.例如,我上学的人叫我乔,但我现在总是去约瑟夫.因此,我正在寻找使用NYSIIS或Double Metaphone对姓氏进行语音搜索,然后使用此名称heirarchy搜索名字.有没有更好的方法来做到这一点 - 也许某种分级相关性使用全名搜索全名而不是对名字和姓氏进行两部分搜索?我的一部分认为,如果我将名称存储为单个值而不是多个值,它可能会以更多的搜索选项为代价,代价是能够通过名字来解决用户问题.
至于平台,我使用SQL Server 2005 - 但是,我没有问题将一些匹配转移到代码中; 例如,为用户预先播种语音键,因为它们不会改变.
任何想法或指导将不胜感激.无数的搜索几乎空了.谢谢!
编辑:似乎功能上有两个截然不同的阵营,我现在肯定坐在中间.我可以看到全文搜索的论点 - 很可能是缺乏数据规范化,而且是一个多部分方法,它对名称的不同部分使用不同的标准.
问题最终归结为用户意图.比尔/威廉的例子很好,因为它根据使用的形式显示了名字的变异.我认为构建名称层次结构是更准确(和可扩展)的解决方案,但会更加复杂.模糊搜索方法以牺牲准确性为代价更容易实现.这是一个公平的比较吗?
解决方案:在做了一些测试后,我决定采用一种方法,初始注册将采用全名,我会将其分成多个字段(forename,surname,middle,suffix等).由于我确信它不会很完美,我将允许用户编辑"部件",包括添加首页或备用名称.就搜索而言,无论是在数据库表中还是作为同义词库,我都需要使用任一解决方案来维护存在的变体.在这种情况下,两者都没有优势.我认为它将取决于性能,我将不得不实际运行一些基准来确定哪个是最好的.谢谢大家,感谢您的投入!
不,全文搜索无助于解决您的问题。
我想您可能想看看以下一些链接:(有趣的是,到目前为止还没人提到 SoundEx)
基本上,SoundEx 允许您评估发音相似的单词的相似程度。该函数在 SQL 2005 上也可用。
作为一个附带问题,在用户启动他/她的搜索之前,使用基于 AJAX 的脚本来提供听起来相似的名称可能对用户来说更直观,而不是返回类似的结果。这样您就可以向用户显示“相似名称”或“您的意思是……”类型的数据。