我在移动设备上有一个带有sqlce-database的c#应用程序。
在数据库中有一个大表,我想搜索城市或地址的名称。问题是,城市名称来自不同的来源,或者由不同的人插入,因此城市包含例如圣XXX,圣YYY 和 St ZZZ 。< / p>
在我的搜索中,我搜索fpr St XXX 或 Saint XXX 无关紧要。结果应该是相同的
当然,这个问题不仅出现在术语圣,这只是一个例子。我还不知道多少,但会有很多不同的术语。
我有一些方法,比如替换
SELECT REPLACE(REPLACE(name,'St.','Saint'),'St','Saint') FROM cities WHERE name = REPLACE(REPLACE(@SearchTerm,'St.','Saint'),'St','Saint')
但表现很难看。
同样SoundEx
并没有真正给出我需要的结果,因为圣和圣听起来并不相似。
城市名称来自外部数据源(通过mergereplication),因此我无法在服务器上更新它们,我不想更新城市名称,而是使用它们,因为它们存储在数据库中。
我如何进行搜索以满足我的需求?
答案 0 :(得分:2)
模糊搜索,每个数据库设计师的祸根......
我会在数据库中以空格和标点符号分割每个名称,并将生成的子字符串输入到新表“city_alias”中,该表还包括原始城市表的外键。
因此,对于“圣彼得堡”,将创建两个别名,“圣徒”和“彼得堡”。别名“Saint”非常频繁,因此搜索查询应该忽略它。
当用户在搜索中输入“St.Petersburg”时,它将被分解为“St”和“Petersburg”。 “St”可能和“Saint”一样频繁,所以应该忽略它。所以在别名表中搜索“Petersburg”,它将返回“圣彼得堡”(以及“圣彼得堡 - Kronstadt”或“彼得堡(阿拉斯加州)”)。
编辑:也可以手动填充别名表,频繁拼写错误(Petersbourg),昵称(Piter),过时名称(Leningrad)或本地拼写(Петербург)。