SQL模糊匹配

2024-01-17

希望我没有重复这个问题。在在这里发帖之前,我在这里做了一些搜索和谷歌。

我正在使用启用全文的 SQL Server 2008R2 运行 eStore。

我的要求,

  1. 有一个产品表,其中包含产品名称、OEM 代码、该产品适合的型号。一切都在文字中。
  2. 我创建了一个名为 TextSearch 的新列。它包含该产品适合的产品名称、OEM 代码和型号的串联值。这些值以逗号分隔。
  3. 当客户输入关键字时,我们会在 TextSearch 列上运行搜索以匹配产品。请参阅下面的匹配逻辑。

我正在使用混合全文和普通的搜索。这给出了更相关的结果。返回临时表中执行的所有查询和不同值。

匹配逻辑,

  1. 运行以下 SQL 以使用全文获取相关产品。但@Keywords会被预处理。假设“CLC 2200”将更改为“CLC* AND 2200*”

    从 dbo.Product 中选择 ID,其中包含(TextSearch、@Keywords)

  2. 另一个查询将使用正常的类似方式运行。因此“CLC 2200”将被预处理为“TextSearch like %clc% AND TextSearch like %2200%”。这只是因为全文搜索不会搜索关键字之前的模式。例如,它不会返回“pclc 2200”。

    SELECT Id FROM dbo.Product WHERE TextSearch like '%clc%' AND TextSearch like '%2200%'

  3. 如果步骤1和2没有返回任何记录,则将执行以下搜索。我对值 135 进行了微调,以返回更多相关记录。

    SELECT p.id FROM dbo.Product AS p INNER JOIN FREETEXTTABLE(product,TextSearch,@Keywords) AS r ON p.Id = r.[KEY] WHERE r.RANK > 135

以上所有组合都以合理的速度运行良好,并返回关键字的相关产品。

但当根本没有找到产品时,我正在寻求进一步改进。

假设客户正在寻找“CLC 2200npk”,但该产品不存在,我需要在“CLC 2200”附近显示下一个产品。

到目前为止我尝试使用声音指数()功能。购买计算 TextSearch 列中每个单词的 soundex 值,并与关键字的 soudex 值进行比较。但这会返回太多记录并且速度也很慢。

例如,“CLC 2200npk”将返回“CLC 1100”等产品。但这不会是一个好的结果。因为它不接近 CLC 2200npk

还有一个不错的here https://stackoverflow.com/questions/921978/fuzzy-matching-using-t-sql。但这使用了 CLR 函数。但我无法在服务器上安装 CLR 功能。

所以我的逻辑应该是,

如果未找到“CLC 2200npk”,则显示“CLC 2200”附近 如果未找到“CLC 2200”,则显示紧邻“CLC 1100”的下一个

问题

  1. 是否可以像建议的那样进行匹配?
  2. 如果我需要进行拼写纠正和搜索,什么是好方法?我们所有的产品清单都是英文的。
  3. 是否有任何 UDF 或 SP 来匹配我的建议中的文本?

Thanks.


一个相当快速的特定领域解决方案可能是使用 SOUNDEX 和 2 个字符串之间的数字距离来计算字符串相似度。仅当您有大量产品代码时,这才会真正有帮助。

使用如下所示的简单 UDF,您可以从字符串中提取数字字符,这样您就可以从“CLC 2200npk”中获得 2200,从“CLC 1100”中获得 1100,这样您现在就可以根据每个输入的 SOUNDEX 输出来确定接近度以及每个输入的数字部分的接近度。

CREATE Function [dbo].[ExtractNumeric](@input VARCHAR(1000))
RETURNS INT
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @input) > 0
    BEGIN
        SET @input = STUFF(@input, PATINDEX('%[^0-9]%', @input), 1, '')
    END
    IF @input = '' OR @input IS NULL
        SET @input = '0'
    RETURN CAST(@input AS INT)
END
GO

就通用算法而言,有一些算法可能会根据数据集大小和性能要求帮助您获得不同程度的成功。 (两个链接都有可用的 TSQL 实现)

  • 双变音位 http://sqlmag.com/t-sql/double-metaphone-sounds-great- 该算法将为您提供比 soundex 更好的匹配,但以速度为代价,但它对于拼写纠正确实很有好处。
  • 编辑距离 http://www.kodyaz.com/articles/fuzzy-string-matching-using-levenshtein-distance-sql-server.aspx- 这将计算将一个字符串转换为另一个字符串所需的按键次数,例如从“CLC 2200npk”到“CLC 2200”为 3 次,而从“CLC 2200npk”到“CLC 1100”为 5 次。

Here http://randomrumenations.blogspot.de/2009/06/improved-t-sql-levenshtein-distance.html是一篇有趣的文章,它将两种算法结合在一起,可能会给您一些想法。

好吧,希望其中一些能有所帮助。

EDIT: Here http://randomrumenations.blogspot.de/2009/06/improved-t-sql-levenshtein-distance.html是一种更快的部分 Levenshtein Distance 实现(阅读帖子,它不会返回与正常结果完全相同的结果)。在我的 125000 行测试表上,它在 6 秒内运行,而我链接到的第一个表则需要 60 秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL模糊匹配 的相关文章

  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • SQL Server 列名区分大小写

    我使用的数据库具有 French CI AS 排序规则 CI 应该代表不区分大小写 但无论如何都是区分大小写的 我试图理解为什么 我断言这一点的原因是 使用 GIVEN 案例设置进行批量插入失败 但使用另一个 Given 案例设置则成功 例
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么我的 CASE 语句要求 THEN 部分的数据类型为 INT?

    我正在尝试运行一个查询 其中以下 CASE 语句是其中一行 我正在使用报表生成器 3 0 但是 我收到一条错误消息 将 varchar 值 Case 1 转换为 int 数据类型时转换失败 Microsoft SQL Server 错误 2
  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

    我已经在 SQL Server 中设置了一个运行良好的存储过程 我现在可以从 VBA 调用它 但想返回一个值以了解是否存在任何错误等 我的 SP 中的最后一个参数设置为 OUTPUT DataSetID int 0 Destination
  • 在 C# 中读取大型 SQL 脚本文件

    我正在尝试阅读一个大脚本 到目前为止我已经尝试了两种选择 选项1 由于内存空间不足的问题 我们无法在SQL Management Studio中打开大型脚本文件 所以最初我使用sqlcmd在远程主机上执行 160 mb SQL 脚本文件 5
  • SQL中的NULL和编程语言中的NULL之间的区别

    我刚刚遇到一个关于如何在 T SQL 可能还有其他形式的 SQL 中处理 NULL 的有趣场景 这个问题得到了很好的描述和回答这个问题 https stackoverflow com questions 2866714 how does a
  • 用户“”登录失败,无法打开登录请求的数据库“Database1.mdf”。登录失败。用户“rBcollo-PC\rBcollo”登录失败

    所以 我几乎解决了所有问题 但现在我要处理另一个问题 我使用了这个连接字符串 SqlConnection con new SqlConnection Data Source SQLEXPRESS Database Database1 mdf
  • 使用包含和不包含的 Linq 查询

    我正在尝试从数据库中获取记录 它应该 getrecords 其中名称包含 searchKey 并且名称不在 exceptTerms 数组中 并以逗号分隔 我怎样才能在 Linq 中做到这一点 Rows from u in DB Client
  • Sql Server 2008 NVARCHAR 长度-1

    如果长度为 1 这意味着什么 这是我的 tbl 结构 Name nvarchar no 1 正如 JNK 在评论中指出的那样 这意味着MAX Name NVARCHAR MAX 来自MSDN http msdn microsoft com
  • 无法删除 Access 中 SQL 表上的注册表

    我有一个在 Access 应用程序中链接的 SQL Server 表 如果我尝试使用删除查询删除记录 则没有问题 但是 如果我尝试直接在表中删除记录或在数据表模式下使用选择查询 Access 不允许我删除记录并引发以下警告 Microsof
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • SQL返回两行之间的秒差

    这个问题与SQL Server有关 我有下表 id size batch code product code additiontime 1 91 55555 BigD Red 2017 05 15 13 00 00 2 91 55555 B
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 更改列时快速删除并重新创建多个索引、视图、统计信息

    我的 项目 表中有一个 StoreNumber 列 我想将其更改为 NOT NULL 我最近清理了所有旧数据 以便不存在空条目 但是 当我执行以下语句时 由于对各种视图 索引和统计信息的多重依赖 它失败了 ALTER TABLE Proje
  • 弹簧隔离支持吗? SQL快照隔离

    我们正在使用 SQL Server 快照隔离可能是提高性能和解决一些死锁问题的好方法 假设我们确实需要更改为快照隔离 我似乎找不到一种简单的方法来在 Springs 上启用快照隔离 Transactional 我发现以下 hibernate
  • SQL Server 连接尝试记录在哪里?

    SQL Server 是否有用于尝试连接的外部日志文件或内部表 或者此类信息是否放置在 Windows 事件日志中的某个位置 您可以启用连接日志记录 对于 SQL Server 2008 您可以启用登录审核 在 SQL Server Man
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 从 Sharepoint 到 SQL Server 的实时同步

    我见过许多将 SQL Server 数据同步到 SharePoint 的解决方案 但没有见过将 SharePoint 列表同步到 SQL Server 的解决方案 有谁知道解决方案吗 商业化就好了 或者 我需要编写一个 Web 部件来创建多

随机推荐

  • CHM 格式替代品?

    Microsoft CHM 格式非常有用 因为它提供了以下功能 带有树视图的目录 指数 索引搜索 基于 HTML 源 但这种格式已经过时并且有很多缺点 存在安全问题 允许执行 JavaScript 代码 不知道新的 HTML 格式 没有记录
  • 反应过渡组出现过渡无法正常工作

    我在用着反应过渡基团 http reactcommunity org react transition group transition渲染组件时处理动画 CSSTransition 我想要一个组件的简单淡入 转出似乎工作正常 但转入则不然
  • Tkinter 单选按钮指示器无法识别

    我希望我的单选按钮通过设置 Indicatoron 0 来使用本页提到的按钮框界面 http effbot org tkinterbook radiobutton htm http effbot org tkinterbook radiob
  • 使用多线程时如何使用Delphi设计时FireDac TFDQuery?

    我想设计我的TFDQuery使用组件编辑器 即在设计时设置 SQL 字符串 选项等 然后在线程中使用查询 我的问题是 线程的每个运行实例都需要自己的查询实例 否则它将不是线程安全的 我是否应该在线程开始运行时克隆查询 即在线程的 Execu
  • 检查 Windows 更新是否可用

    是否可以通过编程方式检查 Windows 是否有可用的新更新 欢迎任何建议 谢谢 The Windows更新代理 http msdn microsoft com en us library aa387287 28VS 85 29 aspxA
  • 如何将当前文档的innerHTML下载为文件?

    有没有办法可以下载当前文档innerHTML作为文件以编程方式 我做了以下尝试但没有成功 它确实下载了当前文档的源代码 但这不是我想要的 因为我想保留任何加载后的文档修改 var save document createElement a
  • 如何使用gin作为服务器编写prometheus导出器指标

    这是官方的prometheus golang client示例 package main import log net http github com prometheus client golang prometheus github c
  • 具有资源文件的动态本地化 WPF 应用程序

    试图使我的 wpf 应用程序本地化 我遵循这个 CodeProject 教程 https www codeproject com Articles 299436 WPF Localization for Dummies 我创建了本地化资源文
  • 二维对象数组返回类型 - NSubstitute

    我遇到强制转换异常 System InvalidCastException 无法将类型 System Object 的对象强制转换为类型 System Object 在 Castle Proxies ITestProxy Get2DArra
  • TortoiseGit 中的“远程跟踪分支”在哪里?

    如何在TortoiseGit中找到 远程跟踪分支 以设置从中拉取的默认分支 打开 浏览参考 对话框 参见https tortoisegit org docs tortoisegit tgit dug browse ref html http
  • R:内部函数可以使用外部函数的变量吗?

    内部函数可以使用调用它的函数环境中存在的变量吗 inner lt function x return x y z a outer lt function x y z a lt x y z inner x 在这里 当我打电话时inner x
  • 使用 sympy 计算多元函数的泰勒级数

    我正在尝试使用 SymPy 计算依赖于三角函数的函数的泰勒级数sinc here http docs sympy org dev modules mpmath functions trigonometric html sinc functi
  • @ActiveProfiles 值未分配给配置

    如果我将它们设置为虚拟机参数 我的活动配置文件将正常工作 我有一个想要使用的测试 ActiveProfiles local 这是我正在使用的类注释 RunWith SpringJUnit4ClassRunner class ContextC
  • 使用 Twitter Bootstrap,如何自定义一页的 h1 文本颜色,而将其他页面保留为默认颜色?

    在我的索引页面上 我希望 h1 文本颜色为白色并带有阴影 但我不想更改其他页面上 h1 的默认行为 我怎样才能实现这个目标 在 Bootstrap 3 中 以下是更改文本颜色的类 p class text muted p grey p cl
  • Python 中更快的套接字

    我有一个用 Python 编写的服务器客户端 它通过 LAN 运行 该算法的某些部分使用套接字密集读取 其执行速度比几乎一样的 http pastie org 3962231用 C 编写 有哪些解决方案可以使 Python 套接字读取速度更
  • 从视图创建位图使视图消失,如何获取视图画布?

    我发现了两种从视图创建位图的方法 但一旦我这样做了 视图就会消失 我就不能再使用它了 生成位图后如何重绘视图 1st public static Bitmap getBitmapFromView View view Bitmap retur
  • 如何从java中的另一个类更新jLabel或setText?

    我正在尝试创建一个JFrame哪里的jLabel和按钮位于另一个类中 我在其中创建了一个方法putTextNow这会将文本设置为jLabel 我读到应该使用多线程来完成 这对我来说更复杂 这是我的代码 NewJFrame java priv
  • 在 JBoss 上安装 SSL 证书

    我有一台运行 JBoss 的服务器 当我在该服务器上输入错误的 URL 时 它会给出如下版本 JBossWeb 2 0 1 GA JBoss 的版本是什么 我们将为我购买并提供 SSL 证书 以便我可以将其安装在 JBoss 中 我真的很感
  • 如何为 Mac OSX 编写虚拟打印机驱动程序 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要为 OSX 编写一个 虚拟打印机驱动程序 以便当用户按 Command P 打开 打印 对话框时
  • SQL模糊匹配

    希望我没有重复这个问题 在在这里发帖之前 我在这里做了一些搜索和谷歌 我正在使用启用全文的 SQL Server 2008R2 运行 eStore 我的要求 有一个产品表 其中包含产品名称 OEM 代码 该产品适合的型号 一切都在文字中 我