2011-01-08 19 views
0

我希望你会发现这个有趣的! C#是解决方案或T-SQL的首选语言。查找“类似的”零件号

考虑以下几项:

项目1:NJ2-12GM50-WO-V13

项目2:NJ2-12GM50-禾V13

你可以猜测,个别输入项目1复制和粘贴,并且输入项目2的个人只使用'o',他可以找到最接近的英文字符。

当有人进入像NJ2-12GM50-禾V13新的零件数量,我们想建议给他们,他们可能意味着NJ2-12GM50-WO-V13。

为了做到这一点,我们希望能够回到存储为VARCHAR他们simplist小写字母的所有字符转换。我对将ASCII字符246(ö)转换为ASCII字符111(o)的解决方案感兴趣。

的想法是,如果我们把含有partnumbers的所有转换版本的查询栏,我们可以轻松地将它们匹配的键盘输入。

当然,我可以做一个解释这样做的,但我不知道是否有一个更聪明的方法。

谢谢!

+0

正如下面提到的,你应该在多大程度上考虑过用户被允许去。一个简单的e与é是一回事。但“接近”的数字是另一回事。作为一个兴趣点,拼写检查器(当然这种类型的事情为生)使用SOUNDEX(或其大哥哥,双重metaphone)。但是,这是越来越严重;) – IamIC 2011-01-09 05:46:42

回答

2

可能是你最好的选择是实现一个函数在C#或T-SQL来计算Levenshtein distance两个部分数字之间。

+0

这是不是矫枉过正?当然,一个简单的“COLLATE”会特别在SQL – gbn 2011-01-08 10:14:38

+0

@gbn - 也许。取决于差异的类型。是的,如果唯一的区别是“o”与“ö”,那么collat​​e将会假定拉丁语言,并假定系统在collat​​e'd结果中找到匹配,并且假设没有其他差异存在,例如缺少字符。 – Thomas 2011-01-08 23:10:25

+0

这非常有帮助,我很欣赏这个建议。我没有提到我们有11,000,000多行的零件号。我们最终做的是将每个零件编号“标记化”(缺少更好的单词)成4个字符序列......所以ROCKY是'摇滚'和'ocky'。我们将所有可能的4个字符序列放入一个“Tokens”表中,并创建了一个名为ItemsTokens的多对多表,它在两个ID上都有一个复合键。触发器将项目标记化。这给了我们太多的结果,但FAST。然后我们在初始结果上使用Levenshtein来抛出不够近的匹配。 – 2011-01-13 17:50:27

1

我不能添加为出于某种原因发表评论,但你可以考虑,而不是(或和),“常用搜索”映射的匹配。这样的系统在一般情况下可能是有用的(即“红衣架 - > AB-999X”等),并可能为你解决这个问题。无论如何,值得考虑。

2

使用COLLATE子句要挟字符串大小写和不区分重音

IF 'NJ2-12GM50-Wö-V13' COLLATE Latin1_General_CI_AI 
     = 
    'NJ2-12GM50-Wo-V13' COLLATE Latin1_General_CI_AI 
     PRINT 'matches' 
ELSE 
     PRINT 'no match 

所以,你可以用它的东西喜欢用不同的COLLATE你可以验证用户输入

SELECT 
    PartNo AS DidYouMeanThis, 
    @Input AS WhenYouEnteredThis 
FROM 
    MyPartNumbers 
WHERE 
    PartNo COLLATE Latin1_General_CI_AI = @Input COLLATE Latin1_General_CI_AI 

然后确保写入精确匹配...

IF NOT EXISTS (SLECT * FROM MyPartNumbers 
      WHERE PartNo COLLATE Latin1_General_BIN = @Input Latin1_General_BIN) 
    RAISERROR ('Oi! I asked DidYouMeanThis', 16, 1) 
ELSE 
    INSERT ...