0

我在 iphone 的 sqlite 中启用了 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')

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

4

1 回答 1

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 文档

更新:

顺便说一句,鉴于您正在执行 FTS,该sqlite3_create_function()方法可能是不可能的,但令我震惊的是,您可以在包含纯 ASCII 字符串的字段上执行 FTS,或者编写自己的标记器来执行这些操作.

于 2012-05-06T03:33:55.153 回答