我在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')
是否有任何错误或是否有其他方法我可以进行波浪形不敏感搜索?我在网上看了答案但没有成功。
答案 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,可以按照这些方式做点什么。