【问题标题】:Compare street name比较街道名称
【发布时间】:2017-11-28 10:16:48
【问题描述】:

我使用 Java、Spring、Ibatis、Oracle 数据库。

在该数据库中,我们有 1 个表是 Street,有 1000 万条记录,重要的列是 street_name

从 GUI 中,我必须按街道搜索公司,例如:街道名称输入是 Schonburgstrasse,但 DB 中的正确数据是:Schönburgstrasse (德语)

您可以看到,主要的区别是: oö 。而且我肯定无法通过 SQL 找到这条记录:

Select * from Street where street_name = 'Schonburgstrasse';

规则是:

  • 我无法再更改数据库架构。

  • 我无法将 10M 条记录一一归一化。之后比较数据

(归一化意味着,我将具有转换 From : Schönburgstrasse, To : Schonburgstrasse)的功能

  • 我必须注意性能问题。

感谢您的宝贵时间。

【问题讨论】:

  • 请澄清几件事 - 您有多少街道记录(1000 万!= 100 亿),为什么您的用户不能输入正确的街道名称?如果用户输入“Schoenburgstrasse”(使用“oe”代替“ö”——用 ASCII 写元音变音符号的常用方法)会发生什么?
  • 100 亿?超过地球上的人类?这是真的吗,因为如果您实际上有 1000 条记录而不是 10 亿条记录,那么不可接受的解决方案可能会变得可以接受。
  • @BIZ 是的,我理解你想要做什么,但这很荒谬,你不应该尝试这个。 hog 和 hög 不一样,如果拼写为 hôg 也不正确。
  • 您可以在 oracle 中使用 translate() ,但这会使您的索引不起作用。如果我在 Oracle 数据库中有 100 亿只用于搜索简单文本,我会使用另一种 o 数据库。例如:Elasticseach、Solr。

标签: java spring oracle performance ibatis


【解决方案1】:

尝试使用 Oracle SOUNDEX 命令,查询将如下所示:

Select * from Street where soundex(street_name) = soundex('Schonburgstrasse');

【讨论】:

  • 这将返回误报:with street as (select 'Schönburgstrasse' as street_name from dual) Select * from Street where soundex(street_name) = soundex('Schanburgstrasse'); 这可能(或可能不会)导致问题。
  • 感谢您的回答,但看起来 soundex 只支持英语,我的数据库是德语。而且我不确定结果是否适用于所有情况。
【解决方案2】:

Oracle Text 提供了处理变音符号等的广泛功能。简而言之:

  • 在您的列上创建全文索引(使用自定义词法分析器)
  • 使用contains() 运算符而不是like 进行搜索

【讨论】:

  • 感谢您的回答,但我无法为该列创建索引。而且我不能使用 contains()。抱歉,我之前没有谈过这个。还有其他想法吗?
  • 如果您不允许添加索引/使用CONTAINS,您可能必须在数据库之外执行搜索; ElasticSearch 似乎是显而易见的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多