在 SQL 中查找相似值的高性能技术?

发布于 2024-07-26 19:38:17 字数 485 浏览 1 评论 0原文

因此,我在表中有一列包含字符串值(从第三方工具填充的关键字)。 我正在开发一种自动化工具来识别相似值的集群,这些相似值可能会标准化为单个值。 例如,“Firemen”/“Fireman”、“Isotope”/“Asotope”或“Canine”/“Canines”。

计算编辑距离的方法似乎很理想,除了它涉及太多字符串操作/比较并且可能无法充分利用 SQL 索引这一事实。

我考虑过按列的 Left(X) 字符进行增量分组,这是最大化索引使用的一种不错的方法,但这种方法实际上只在查找单词末尾有差异的单词时有效。

有人有一些在 SQL 中有效解决这个问题的好主意吗?

注意:我意识到这个问题非常类似于 (查找两个字符串的相似程度),但这里的区别是需要在 SQL 中有效地完成此操作。

So I've got a column in a table that contains a string values (keywords populated from a 3rd party tool). I'm working on an automated tool to identify clusters of similar values that could probably be normalized to a single value. For example, "Firemen"/"Fireman", "Isotope"/"Asotope" or "Canine"/"Canines".

An approach that calculates the levenshtein distance seems ideal except for the fact that it involves too much string manipulation/comparison and would probably make poor use of SQL indexes.

I've considered incrementally grouping by the Left(X) characters of the column, which is a not-so-bad way to maximize index use, but this approach is really only effective at finding words with differences at the very end of the word.

Anyone got some good ideas for solving this problem efficiently in SQL?

Note: I realize this question is very similar to (Finding how similar two strings are), but the distinction here is the need to do this efficiently in SQL.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

秋心╮凉 2024-08-02 19:38:17

您没有提及您使用的数据库,但如果是 T-SQL,您可以使用 SOUNDEX 值和差异

You don't mention what DB your using, but if it's T-SQL, you could use the SOUNDEX value and difference.

心的位置 2024-08-02 19:38:17

如果您使用 SQL Server,您可能会考虑使用 SOUNDEX() 函数,如下所示:

...
where
   SOUNDEX("searchterm") = SOUNDEX(searchvaluefield)

它应该对字符串进行语音匹配...

一些奇怪的例子...所以看来您可以通过始终附加来捕获复数形式两边都有复数文本,因为多个 ' 的声音相同......:-)

select soundex('Canine'), soundex('Canines')
go

----- ----- 
C550  C552  

1 Row(s) affected


select soundex('Canine'), soundex('Caynyn')
go

----- ----- 
C550  C550  

1 Row(s) affected


select soundex('Canines'), soundex('Caniness')
go

----- ----- 
C552  C552  

1 Row(s) affected

If you are using SQL Server, you might look into using the SOUNDEX() function as in:

...
where
   SOUNDEX("searchterm") = SOUNDEX(searchvaluefield)

it is supposed to do Phonetic matching on the strings ...

Some odd examples ... so it seems you could catch plurals by always appending the plural text to both sides, since multiple 's's sound the same ... :-)

select soundex('Canine'), soundex('Canines')
go

----- ----- 
C550  C552  

1 Row(s) affected


select soundex('Canine'), soundex('Caynyn')
go

----- ----- 
C550  C550  

1 Row(s) affected


select soundex('Canines'), soundex('Caniness')
go

----- ----- 
C552  C552  

1 Row(s) affected
飘落散花 2024-08-02 19:38:17

约翰,如果您使用的是 MS SQL Server,您可以利用 全文索引服务。 全文搜索功能具有一些强大的功能,您可以使用它们来实现这。

John, if you are using MS SQL Server, you can take advantage of the Full-Text Indexing service. Full-text search functionality has some powerful functions using which you can achieve this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文