【问题标题】:Delphi - How to do searching for incomplete string matchesDelphi - 如何搜索不完整的字符串匹配
【发布时间】:2014-06-06 00:27:37
【问题描述】:

我有大约 300,000 个企业的列表,这是一个小型关系 rdbms(ComponentAce 的 AbsoluteDB)中的 varchar 字段用户需要能够搜索企业名称,但用户可能没有确切的名称.

例如,名称是堪萨斯国家银行

理想情况下,用户可以开始输入 National 并让它找到所有包含 National 的字符串(注意它不是第一个单词) 我希望有一种方法可以让用户输入“国家银行”(而不是国家银行),并且仍然可以找到正确的数据。

在试图解决这个问题时,我认为文本检索系统比我所寻找的要多得多。我的整个数据文件大约 15 MB。全文检索系统的开销超出了我的需要。模糊搜索,使用某种类型的字符串相似性算法是我想要的方式吗?例如,像 DamerauLevenshtein 这样的东西?

【问题讨论】:

  • 你最好的办法是在谷歌上搜索“全文搜索 Delphi”,你会得到很多结果。这个问题可能是题外话,因为它可能会导致一些意见和产品建议。另一种选择是查看 soundex。有许多数据库包含 soundex 查询功能。例如,docs.oracle.com/cd/B19306_01/server.102/b14200/functions148.htm 用于 Oracle,msdn.microsoft.com/en-us/library/ms187384.aspx 用于 SQL 服务器。这最终取决于您在寻找什么。
  • “我有一个列表”非常模糊。该“列表”在哪个容器中?它是在文本文件、数据库还是其他东西中?定位信息的方式因信息的存储方式而异。如果不清楚为什么要这样做,请致电最近的汽车维修店,询问他们更换汽车发动机的费用,看看他们是否会给您“一刀切”的估计;根据您驾驶的是普通轿车还是法拉利,费用会有很大不同。请具体说明您在这里问的是什么。
  • 感谢您的编辑。 :-) 我不使用 Absolute DB,但 AFAIK 它支持 SQL,这意味着它应该支持带有通配符的 LIKE 运算符。这在它的 SQL 语法中可用吗?
  • 你基本上有4个选项。 LIKE、SOUNDEX(AbsoluteDB 似乎不支持)、像 Rubicon 这样的全文搜索引擎,或者将整个集合加载到内存中并自己进行 soundex/搜索。
  • @Graymatter:或者LIKE '%National%',当然不会使用索引,可能会慢一些。

标签: string delphi search fuzzy-search


【解决方案1】:

我过去解决这个问题的方法是创建一个倒排索引,消除高频词(a、and、the、with 等),然后要么这样做:

  1. 线性匹配基于每个单词的输入内容;
  2. 删除元音;或
  3. 使用 Soundex。

是否对输入的每个字符进行搜索取决于您,尽管这种方法非常适合实时过滤。 (关键是,您不会在输入的每个字符上都点击数据库。您在前几个字符之后点击它,然后从结果中过滤其余字符。)

我已经使用内存中的搜索表和数据库表完成了这项工作。

对于倒排索引,您将所有内容分解为单词并保存每个单词的记录编号列表。当该人键入“natio”时,它会显示与以词干“natio”开头的任何单词匹配的所有记录的列表,例如“nation”、“nations”、“national”等。因此“national”可能出现在25条记录,“nations”可能在37条,“nation”可能在58条。显然,词干越长,命中数越少。

如果他们输入了多个单词,则将每个单词视为单独的搜索,但将结果放在一起。所以“nation”和“bank”只会显示两个词干一起出现的结果。

这真的不是那么难。首先列出数据库中的所有单词及其频率计数。消除所有无意义的高频词,以及任何其他不是很有意义的词。然后从其余部分构建一个倒排索引。

如果数据变化非常频繁,则保留无意义单词列表,并在更新倒排词索引后自动重建倒排索引,首先删除这些单词。

结果并没有那么大,如果你正确实现它应该会运行得相当快。

我从未见过这样的情况,其中使用带有 LIKE 的 SQL 查询的运行速度几乎与这种方法一样快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2022-10-22
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多