在数据库中搜索类似的术语

时间:2012-11-22 13:07:40

标签: c# sql search compact-framework sql-server-ce

我在移动设备上有一个带有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),因此我无法在服务器上更新它们,我不想更新城市名称,而是使用它们,因为它们存储在数据库中。

我如何进行搜索以满足我的需求?

1 个答案:

答案 0 :(得分:2)

模糊搜索,每个数据库设计师的祸根......

我会在数据库中以空格和标点符号分割每个名称,并将生成的子字符串输入到新表“city_alias”中,该表还包括原始城市表的外键。

因此,对于“圣彼得堡”,将创建两个别名,“圣徒”和“彼得堡”。别名“Saint”非常频繁,因此搜索查询应该忽略它。

当用户在搜索中输入“St.Petersburg”时,它将被分解为“St”和“Petersburg”。 “St”可能和“Saint”一样频繁,所以应该忽略它。所以在别名表中搜索“Petersburg”,它将返回“圣彼得堡”(以及“圣彼得堡 - Kronstadt”或“彼得堡(阿拉斯加州)”)。

编辑:也可以手动填充别名表,频繁拼写错误(Petersbourg),昵称(Piter),过时名称(Leningrad)或本地拼写(Петербург)。