2012-05-05 24 views
0

我启用了sqlite的FTS为iPhone和尝试这样的作品不敏感的比赛,虽然很慢:SQLite,让iOS的 - 雅绅特(波浪)在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') 

是否有任何错误或有任何其他的方法,我可以做一个波浪大小写的搜索?我在网上查找答案并没有成功。

回答

3

两种方法:

首先,你可以违反正常形态和列添加到您的包含搜索领域的ASCII唯一表示你的表。此外,在对这个辅助搜索列进行搜索之前,您也会从正在搜索的字符串中删除国际字符(这样您就可以在仅使用ASCII的表示形式的字段中查找纯ASCII字符串)。

顺便说一句,如果你想用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,沿着这些线做一些事情。

+0

谢谢,我只是想你的第一种方法作为最后的选择。我试了一下,它工作得很好,很快。 –