ios app用icu编译sqlite fts,但是当我输入像“z”这样的字母时,它无法得到完美的答案

时间:2013-08-22 16:14:40

标签: ios sqlite icu

在sqlite中我:

  1. 执行create virtual MyTable (tokenize =icu ,id text,subject text,abstract text)
  2. 然后成功insert info MyTable (id,subject,abstract) values (?,?,?) 所以我有一排:今天天气不错fmowomrogmeog,wfomgomrg,我是谁erz
  3. 当我执行select id from MyTable where MyTable match ‘z*’时,它不会返回任何内容,每当我搜索单个字母时,它都不会返回任何内容。但是,如果我搜索“m”或“天气”或“天”,它就会起作用。

    我知道sqlite只支持前缀,所以我使用的是ICU。我犯了错误吗?

    注意我已经查看了foxmail上的源代码,我觉得我可以搜索',''f'等等。

2 个答案:

答案 0 :(得分:4)

试试Hai Feng Kao's character tokenizer。它可以搜索前缀,后缀和其间的任何内容。它也支持中文。我认为你不能找到任何支持任意子串搜索的其他标记器。

顺便说一下,这是一种无耻的自我推销。

如果要在Objective-C中打开由character tokenizer编码的数据库,请执行以下操作:

#import <FMDB/FMDatabase.h>
#import "character_tokenizer.h"

FMDatabase* database = [[FMDatabase alloc] initWithPath:@"my_database.db"];
if ([database open]) {
    // add FTS support
    const sqlite3_tokenizer_module *ptr;
    get_character_tokenizer_module(&ptr);
    registerTokenizer(database.sqliteHandle, "character", ptr);
}

答案 1 :(得分:2)

您也可以尝试使用FMDB的FMSimpleTokenizer。 FMSimpleTokenizer使用内置CFStringTokenizer并根据apple文档&#34; CFStringTokenizer允许您以语言中立的方式将字符串标记为单词,句子或段落。它支持日语和中文等不按空格分隔单词的语言&#34;

如果你检查FMSimpleTokenizer代码,你会发现这是通过调用CFStringTokenizerAdvanceToNextToken&amp; CFStringTokenizerGetCurrentTokenRange。

一个有趣的事实&#34;是CFStringTokenizer如何标记中文单词,例如&#34;欢迎使用&#34;将被标记为&#34;欢迎&#34; &安培; &#34;使用&#34;,这完全有道理,但是如果你搜索&#34;迎接&#34;,你会惊讶地发现没有任何结果!

在这种情况下,您可能需要编写像Hai Feng Kao的sqlite tokenizer这样的标记器。