gpt4 book ai didi

sql-server - 模糊字符串匹配 SQL - 不同顺序的单词

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:44 28 4
gpt4 key购买 nike

如何匹配不准确且单词顺序不同的字符串。通常字符串具有相似的数字模式,但单词的顺序可能不同。

比如我会考虑一个很好的字符串匹配:

目标字符串:Apple 10mg/51L Tail

测试字符串:Tail 10mg/51L Apple(只是打乱单词,拼写正确)

我还会考虑以下字符串之间的良好匹配:

测试字符串:51L MissleadingLENWord ObfuscateTail 10mg Apple(如果我们用LIKE子句一一检查每个单词,就可以在测试字符串中找到目标字符串的所有单词即目标字符串的“尾部”可以在单词“ObfuscateTail”的测试字符串中找到。

我想在返回百分比数字的函数中看到这个问题的解决方案,这意味着字符串有多相似 - 零 - 字符串不同,100% 两个字符串相同。

我应该使用哪种算法?最好能用 SQL Server 实现。

我可以在这里找到一些推荐的算法:Fuzzy matching using T-SQL .leading answer 中提到的Levenshtein 距离算法是否适用于单词的混合顺序?

最佳答案

只要单词是分开的(空白、/ 或任何其他定界符),这可以通过字符串拆分器和命中计数来完成,但您不会在中找到“Tail” “混淆尾部”。您还需要一些CamelCase 解析...

一个相当简单的解决方法是对所有片段进行 LIKE 搜索,但这可能会带来很多结果 - 而且(当然!)这不会很快......

尝试这样的事情:

DECLARE @mockupTable TABLE(ID INT IDENTITY, YourTarget VARCHAR(100));
INSERT INTO @mockupTable VALUES('51L MissleadingLENWord ObfuscateTail 10mg Apple')
,('Some other 51L with differing words');

DECLARE @search VARCHAR(100)='Apple 10mg/51L Tail';

WITH Parted AS
(
SELECT CAST('<x>' + REPLACE(REPLACE(@search,' ','/'),'/','</x><x>') + '</x>' AS XML) AS SearchFragmentsXML
)
,AllSearchWords AS
(
SELECT frgmnt.value(N'.',N'nvarchar(max)') AS Frg
FROM Parted
CROSS APPLY SearchFragmentsXML.nodes(N'/x') AS A(frgmnt)
)
SELECT ID
,COUNT(*) AS CountHits
,(SELECT COUNT(*) FROM AllSearchWords) AS CountFragments
FROM @mockupTable AS t
INNER JOIN AllSearchWords AS Frgs ON t.YourTarget LIKE '%' + Frgs.Frg + '%'
GROUP BY ID;

结果

ID  CountHits   CountFragments
1 4 4
2 1 4

“命中数”越接近“片段数”越好。

更新:一个函数(不推荐)

DROP FUNCTION dbo.YourSearch;
GO
CREATE FUNCTION dbo.YourSearch(@SearchIn VARCHAR(MAX), @SearchFor VARCHAR(100)='Apple 10mg/51L Tail')
RETURNS FLOAT
AS
BEGIN
DECLARE @rslt DECIMAL(10,4) =
(
SELECT CAST(COUNT(*) AS FLOAT) / MAX(SearchFragmentsXML.value('count(/x[text()])','float'))
FROM
(
SELECT CAST('<x>' + REPLACE(REPLACE(@SearchFor,' ','/'),'/','</x><x>') + '</x>' AS XML) AS SearchFragmentsXML
) AS Parted
CROSS APPLY SearchFragmentsXML.nodes(N'/x') AS A(frgmnt)
WHERE @SearchIn LIKE '%' + frgmnt.value(N'text()[1]',N'nvarchar(max)') + '%'
);

RETURN @rslt;
END
GO

DECLARE @mockupTable TABLE(ID INT IDENTITY, YourTarget VARCHAR(100));
INSERT INTO @mockupTable VALUES('51L MissleadingLENWord ObfuscateTail 10mg Apple')
,('Some other 51L with differing words');

SELECT t.*
,dbo.YourSearch(t.YourTarget,'Apple 10mg/51L Tail') AS HitCoeff
FROM @mockupTable AS t;

结果

ID  YourTarget                                          HitCoeff
1 51L MissleadingLENWord ObfuscateTail 10mg Apple 1
2 Some other 51L with differing words 0,25

提示:如果您使用带有 SessionID 的物理表,您可以在其中填写搜索字符串的片段,这将大有帮助。然后将 SessionID 传递给函数并从那里获取片段。这至少可以避免重复拆分并可以使用结果缓存。

关于sql-server - 模糊字符串匹配 SQL - 不同顺序的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com