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

2つのアプローチ:

まず、通常の形式に違反して、検索可能なフィールドのASCIIのみの表現を含む列をテーブルに追加できます。さらに、この2次検索列に対して検索を実行する前に、検索対象の文字列から国際文字も削除します(このようにして、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 に答える