【问题标题】:Fast matching of input string with strings in db输入字符串与数据库中字符串的快速匹配
【发布时间】:2018-12-22 10:05:14
【问题描述】:

给定一种字符串匹配算法,该算法适用于某些字符串(例如“123456789”)和字符串模式(例如“1*******9”)。 字符串模式不是任何类型的正则表达式或 SQL LIKE 模式 - 它们仅提供“*”占位符,表示“单个数字或字母”。

因此,算法会将这些值视为“相等”:

12ABCDE89
12A***E89
**A****8*
*********

数据存储在关系数据库 (MS SQL Server) 中,.net 核心应用程序通过 EntityFramework Core 对其进行寻址。 所需的场景是获取 500 个输入字符串(特定或模式)并在数据库中(包含 100 万行的表中)查找匹配的行。

首先我使用 LIKE 模式匹配来实现它(首先我将输入字符串转换为 LIKE 模式,然后为 WHERE 子句构建谓词),但测试表明它的性能无法接受。

我可以使用 MSSQL 的全文搜索功能来执行此任务吗?在这种情况下,谓词会是什么样子?关于实施还有其他想法吗?

【问题讨论】:

    标签: sql-server full-text-search entity-framework-core


    【解决方案1】:

    您可以尝试 CLR 用户定义函数方法 (example)。但是您根本不需要使用 SQL 查询。只需使用您的算法比较 2 个字符串。这种方法理论上应该更快

      [SqlFunction(
          DataAccess = DataAccessKind.None,
          SystemDataAccess = SystemDataAccessKind.None,
          IsPrecise = true,
          IsDeterministic = true)
      ]
    
      // Have to be public and static
      public static bool CustomIsEqualTo(string baseString, string stringToCompare)
      {
          return true;   
      }
    

    【讨论】:

    • 这里的问题将是从数据库中获取一百万行......我没有说,这个操作是在循环中执行的,同样的操作也会修改行(读取在下一次迭代中)。因此,这意味着在估算您提出的解决方案时,我必须考虑数据获取时间。我已经测试过了,它也需要太长时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2011-01-07
    • 2013-06-08
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多