大家好,所以我对昵称搜索有疑问。
我有一个非常大的数据库,在我的帐户实体中,我有一个名字列。当用户按名字搜索帐户时,他们可能正在使用昵称。例如,搜索Bob,也应该返回Robert。
我认为这样做的方法是创建一个名为nickname的表,其中包含两个列,昵称和名称。这样我们就可以映射bob-> robert。
然后在执行查询时使where子句看起来像这样“WHERE firstname IN(SELECT name FROM nickname WHERE nickname ='bob')”
我遇到的两个问题是,上面的查询看起来非常低效,并且对于大型数据集会非常慢(我可能在这里错了所以请告诉我,如果是这样,当我说大数据集时我的意思是1400万行)。
我遇到的第二个问题是从哪里获取昵称数据。这是我到目前为止唯一找到的东西:https://code.google.com/p/nickname-and-diminutive-names-lookup/downloads/list
非常感谢任何帮助。
答案 0 :(得分:1)
一种选择是使用全文搜索:
http://www.postgresql.org/docs/current/static/textsearch.html
这将允许您添加自定义词典,以及其他丰富多彩的功能:
http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html
答案 1 :(得分:0)
我必须解决类似的问题。我们有一个表格,其名称变化与个人相关联。这是一个作者数据库。
然后,我们使用soundex和双元电话条目为这些名称(预生成)创建了一个映射表,然后对该表进行查询以查找个人。
如果您不熟悉soundex或双变音符,则在使用拼写错误和类似名称时,它们是匹配的语音算法。 Soundex是为美国人口普查开发的。
在我们的案例中,我们已经发布了该人发布的每个名称的变体,而不是一般的名称列表。但是,soundex算法可以帮助进行类似的拼写。你仍然需要从某个地方获得一个昵称列表,但这应该有助于提高性能。
我提出两种算法的原因是我们只使用一种算法进行了很多碰撞,但是这两种算法一起使用它是一个相当不错的过滤器。 Double Metaphone对非西欧名字的效果更好。
我建议添加一个前端元素,让您的客户服务人员(或客户)也添加他们的昵称。客户可以帮助您建立昵称列表,并且您可以使用已知的昵称来帮助最终模糊搜索其他人。