在sqlite中我:
create virtual MyTable (tokenize =icu ,id text,subject text,abstract text)
insert info MyTable (id,subject,abstract) values (?,?,?)
所以我有一排:今天天气不错fmowomrogmeog,wfomgomrg,我是谁erz 当我执行select id from MyTable where MyTable match ‘z*’
时,它不会返回任何内容,每当我搜索单个字母时,它都不会返回任何内容。但是,如果我搜索“m”或“天气”或“天”,它就会起作用。
我知道sqlite只支持前缀,所以我使用的是ICU。我犯了错误吗?
注意我已经查看了foxmail上的源代码,我觉得我可以搜索',''f'等等。
答案 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这样的标记器。