Iphone fts表中不区分iOS重音(tilde)的Sqlite匹配

Iphone fts表中不区分iOS重音(tilde)的Sqlite匹配,iphone,ios,sqlite,Iphone,Ios,Sqlite,我在sqlite for iphone中启用了fts,并尝试了此功能,尽管速度非常慢: SELECT field FROM table_fts WHERE replace(replace(replace(replace(replace(lower(field), 'á','a'),'é','e'),'í','i'),'ó','o'),'ú','u') LIKE replace(replace(replace(replace(replace(lower('%string%'), 'á','a'),

我在sqlite for iphone中启用了fts,并尝试了此功能,尽管速度非常慢:

SELECT field FROM table_fts WHERE replace(replace(replace(replace(replace(lower(field), 'á','a'),'é','e'),'í','i'),'ó','o'),'ú','u') LIKE replace(replace(replace(replace(replace(lower('%string%'), 'á','a'),'é','e'),'í','i'),'ó','o'),'ú','u')
但当我想使用MATCH时,它不起作用,它不会给我带来结果,也没有错误

SELECT field FROM table_fts WHERE replace(replace(replace(replace(replace(lower(field), 'á','a'),'é','e'),'í','i'),'ó','o'),'ú','u') MATCH replace(replace(replace(replace(replace(lower('string'), 'á','a'),'é','e'),'í','i'),'ó','o'),'ú','u')
是否有任何错误,或者是否有其他方法可以进行不区分波浪号的搜索?。我在网上查找答案,但没有成功。

有两种方法:

首先,您可以违反标准格式,向表中添加列,这些列只包含可搜索字段的ASCII表示形式。此外,在对这个二次搜索列进行搜索之前,您还可以从正在搜索的字符串中删除国际字符(这样您就可以在一个只有ASCII表示的字段中查找只有ASCII的字符串)

顺便说一下,如果您想使用ASCII进行更通用的国际字符转换,可以尝试以下方法:

- (NSString *)replaceInternationalCharactersIn:(NSString *)text
{    
    NSData *stringData = [text dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease];
}
其次,您可以使用
sqlite3\u create\u function()
编写您自己的函数(该函数可能会调用上述函数的排列),您可以在SQL语句本身中使用它。看

更新:

顺便说一句,考虑到您正在进行FTS,可能不可能采用
sqlite3\u create\u function()
方法,但我觉得您可以在仅包含ASCII字符串的字段上进行FTS,也可以编写自己的FTS来执行这些操作。

两种方法:

首先,您可以违反标准格式,向表中添加列,这些列只包含可搜索字段的ASCII表示形式。此外,在对这个二次搜索列进行搜索之前,您还可以从正在搜索的字符串中删除国际字符(这样您就可以在一个只有ASCII表示的字段中查找只有ASCII的字符串)

顺便说一下,如果您想使用ASCII进行更通用的国际字符转换,可以尝试以下方法:

- (NSString *)replaceInternationalCharactersIn:(NSString *)text
{    
    NSData *stringData = [text dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease];
}
其次,您可以使用
sqlite3\u create\u function()
编写您自己的函数(该函数可能会调用上述函数的排列),您可以在SQL语句本身中使用它。看

更新:


顺便说一句,考虑到您正在进行FTS,
sqlite3\u create\u function()
方法可能是不可能的,但我觉得您可以在仅包含ASCII字符串的字段上进行FTS,也可以编写自己的FTS来执行这些操作。

谢谢,我刚刚考虑将第一种方法作为最后一种选择。我试过了,效果很好,速度也很快。谢谢,我只是想把你的第一种方法作为最后一种选择。我试过了,效果又好又快。