问题描述
我想自定义sql Server FTS以更好地处理特定于语言的功能。
在许多语言中,例如波斯语和阿拉伯语,都有相似的字符,在适当的搜索行为中,它们应被视为与这些组相同的字符:
- ['آ','ا','ء','ا']
- ['ي','ی','ئ']
目前,我最好的解决方案是将重复数据存储在新列中,并用代表成员替换这些字符,并规范化搜索词并在重复列中执行搜索。
有没有办法告诉sql Server将这些组的任何成员视为相同的字符?
解决方法
据我了解,这将用于建议目的,因此准确无误并不重要。所以 在波斯语中,实际上上述列表中的所有字符都没有相同的含义,但是我们可以说它们在某些书写情况下确实具有共享的缩写形式('آ'!='اِ',但它们都可以写为'ا')
场景1:输入文本为完整形式 想象“ محمّد”是表中格式为(id int,text nvarchar(12))的记录,命名为“表”。 删除特殊字符后,我们可以使用以下命令:
从[db]。[dbo]。[表]中选择*,其中文本REPLACE(text,'ّ','')= REPLACE(N'محمد','ّ','');
结果将是
场景2:输入格式简短 想象“محمد”是表中格式为(id int,text nvarchar(12))的名为“表”的记录。
在这种情况下,我们需要在对数据库进行查询之前对文本进行一些逻辑运算
例如如果我们知道输入了“محمد”,并且有此特殊字符的列表,则应在查询中轻松搜索为:
从[db]。[dbo]。[表]中选择*,其中REPLACE(text,'ّ','')='محمد';
注释:
此解决方案并非最佳解决方案,因为输入不应在客户端受到影响,如果sql server配置为处理此问题会更好。 对于不懂波斯语的人,他只是想告诉sql َ A = [“ B”,“ C”]和a在列表中具有相同的值,因此: 当搜索“爸爸”一词时,如果存在任何单词“ dbd”或“ dcd”也将其返回。
添加:
某些字符集有时可能具有相同的含义(['ي','أ']相同,但['آ','اِ']不相同),所以在第一种情况下:
从[db]。[dbo]。[表]中选择*,其中像N'%هی[أي]ت'这样的文本和像N'هی[أي]ت%'这样的文本;