适用于iOS的Sqlite - fts表中的Accent(代字号)不敏感匹配

时间:2012-05-05 21:28:25

标签: 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'),'é','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')

是否有任何错误或是否有其他方法我可以进行波浪形不敏感搜索?我在网上看了答案但没有成功。

1 个答案:

答案 0 :(得分:3)

两种方法:

首先,您可以违反普通表单并向表中添加包含可搜索字段的仅ASCII表示的列。此外,在对此辅助搜索列进行搜索之前,您还要从正在搜索的字符串中删除国际字符(这样,您在具有仅ASCII表示的字段中查找仅ASCII字符串)。 / p>

顺便说一下,如果你想用ASCII进行更通用的国际字符转换,可以试试类似的东西:

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

    return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease];
}

其次,你可以使用sqlite3_create_function()编写自己的函数(可能会调用上面的排列),你可以在SQL语句中使用它们。请参阅SQLite documentation

<强>更新

顺便说一句,假设您正在进行FTS,那么sqlite3_create_function()方法可能无法实现,但是我可以在包含仅ASCII字符串的字段上执行FTS,或者编写您的拥有tokenizer,可以按照这些方式做点什么。