【问题标题】:search in database for similar terms在数据库中搜索类似的术语
【发布时间】:2012-11-22 13:07:39
【问题描述】:

我在移动设备上有一个带有 sqlce 数据库的 c# 应用程序。

在数据库中有一张大表,我想在其中搜索城市或地址的名称。问题是,城市名称来自不同的来源,或者是由不同的人插入的,因此城市包含例如 Saint XXX, St. YYYSt ZZZ

在我的搜索中,我搜索 fpr St XXX 还是 Saint XXX 都无关紧要。结果应该是一样的

当然这个问题不仅仅出现在Saint这个词上,它只是一个例子。我还不知道多少,但会有很多不同的术语。

我有一些方法,比如替换

SELECT REPLACE(REPLACE(name,'St.','Saint'),'St','Saint') FROM cities WHERE name = REPLACE(REPLACE(@SearchTerm,'St.','Saint'),'St','Saint')

但性能很差。

另外,SoundEx 并没有真正给出我需要的结果,因为 Saint 和 St 听起来根本不相似。

城市名称来自外部数据源(通过合并复制),因此我无法在服务器上更新它们,也不想更新城市名称,但可以使用它们,因为它们存储在数据库中。

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

【问题讨论】:

  • Select name FROM city WHERE name like '%' + @SearchTerm
  • 如果用户从未输入过像圣彼得堡这样的东西,而只输入了彼得堡,这将起作用。但他应该可以进入圣彼得堡,圣彼得堡或圣彼得堡
  • 这将是一个技巧,你可以用空格('')分割你的搜索字符串并检查第 0 个位置的字符串是(St. 或 Saint 或 St),如果是,则忽略该字符串并发送查询字符串的其余部分并使用此查询Select name FROM cities WHERE name like '%' + @SearchTerm + '%'
  • 是的。我可以使用带有bad strings 的字典并自动创建我的SearchTerm。听起来不错。谢谢
  • 别忘了投票,如果它对你有帮助....:-)

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


【解决方案1】:

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

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

因此,对于“Saint Petersburg”,将创建两个别名,“Saint”和“Petersburg”。别名“Saint”很可能是一个非常常见的别名,因此在搜索查询中应该忽略它。

当用户在搜索中输入“St.Petersburg”时,它会被分成“St”和“Petersburg”。 “St”可能与“Saint”一样频繁,因此应该忽略它。因此在别名表中搜索“Petersburg”,这将返回“Saint Petersburg”(以及“Saint Petersburg-Kronstadt”或“Petersburg (Alaska)”)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2021-03-02
    相关资源
    最近更新 更多