【问题标题】:How to handle search variant on MySQL query?如何处理 MySQL 查询的搜索变体?
【发布时间】:2012-10-26 02:51:46
【问题描述】:

我的PhoneNos表上有电话号码列表

ID | PhoneNo
1 | +61 2 9666 8000 

我们尝试在我们的 Content 表(即 desc 字段)中搜索这个电话号码

挑战其实是:

desc 字段是一个文本,输入可以是任何内容,例如:

ContentID | Desc    
1 | bla bla ... +61 (02) 9666 8000 ... bla bla
2 | bla bla ... +61-2-9666-8000 bla bla
3 | bla bla ... +61 2 96668000 bla bla
4 | bla bla ... +61296668000 00116129668000 bla bla

或者可以是从额外的间距安排的任何东西,例如

5 | bla bla ... +61  (02) 9666   8000 ... bla bla
6 | bla bla ... +61-2 9662 0382 ... bla bla

这是一个澳大利亚的电话号码,但它可能是美国或任何其他国家/地区,因此与 1 个特定国家/地区并不紧密。

此手机号之前和之后没有任何图案。所以它可以是任何东西。

有没有办法轻松处理这种事情?我可能可以在上面构建每个条件,但我只是想知道是否有更好的解决方案。

【问题讨论】:

  • 您想如何对记录进行排序?
  • 这里有一个类似的question,您可以检查答案是否适合您。
  • @JohnWoo:我们只需要标记是否在该内容表(desc 字段)上找到了电话号码。
  • 我已经编辑了问题以使其更清晰

标签: mysql


【解决方案1】:

只需将用户输入标准化为易于搜索的格式,即“+ [ x ]”。如果用户输入额外的空格,则删除它们。如有必要,添加国家代码。从开头删除 00 并替换为 +。您甚至可以将“电话号码”分成三列,以便于搜索。

【讨论】:

    【解决方案2】:

    我(高度未受过教育)的想法是使用正则表达式替换(请参阅here)。基本上去掉内容中的所有内容,除了数字和加号(感觉很笨重吗?:)),然后用相同的处理(\\+\d+,基本上)与您的控制字符串进行比较。这做出了相当广泛的假设,即不会有另一个随机数字/字符与您的数字匹配的字符串产生误报(我认为从概率的角度来看不太可能,但总是有可能)。

    我正在修补我确信是非常低效、不优雅且可能不正确的解决方案,并意识到它无法处理带有括号内领先 0 的案例(因为这似乎不是存在于其他模式中)。如果你好奇的话可以找到here,但我认为正则表达式解决方案可能是最有效的处理方式。

    【讨论】:

    • @RocketDonky:我喜欢你的第二个解决方案。没有想过通过删除空间等来剥离所有内容。我猜唯一的挑战是检测 0011 61 9666 8000 ......有些人将这个拨号拨到海外代码 0011(每个国家/地区不同)但无论如何至少它很接近够了。
    • 其实没关系!!!如果您精简,那么文本将是:“blabla00116196668000blabla”,至少它将被拾取该字符串。无论如何,拥有例如 001161 的电话号码的机会很小
    • @dcalliances 是的,可能有一些极端案例没有涵盖(我丑陋的美国特色是否表现出来?:))。我想可以在控制字符串端完成一个潜在的解决方案?也许调整它以考虑各种海外代码,然后根据内容检查这些实例?
    【解决方案3】:

    为什么不直接从电话号码中删除特殊符号并将它们存储为数字字符串?

    您需要考虑的唯一情况是 +,因为它替换了 00。

    所以基本上,您的记录将只有数字,您的输入将只有数字。只需确保将数据库和输入中的 + 规范化为某些内容即可。

    我要做的是用 00 而不是 + 来存储它们,这样当输入 00 的搜索输入通过时,它会工作,以及带 + 的搜索。希望这是有道理的。

    【讨论】:

    • 内容表的输入是我们无法控制的......所以用户可以输入任何内容。其中一段可能有电话号码。那电话显然可以是任何格式。我们需要根据我们的电话号码搜索该内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2021-12-10
    • 2012-11-12
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多