最近項(xiàng)目需要數(shù)據(jù)庫(kù)全文檢索,我們所使用的FMDB支持FTS3的使用
FTS3 和FTS4 是一個(gè)SQLite 虛擬表的模塊, 允許用戶(hù)執(zhí)行全文搜索一組文檔從最常見(jiàn)()方法
但是在使用過(guò)程中發(fā)現(xiàn)有很多不一致的地方 如:
CREATE VIRTUAL TABLE en1 USING fts3(content TEXT) */ FTS3 表/*
CREATE TABLE IF NOT EXISTSen1(content TEXT); /* 普通表*/
創(chuàng)建數(shù)據(jù)庫(kù)成功時(shí)候發(fā)現(xiàn)居然有四張表:(可能是相關(guān)的索引吧)

插入數(shù)據(jù)和我們正常沒(méi)有什么區(qū)別
replace intoen1(content) values('%@')
但是查詢(xún)的時(shí)候不是我們通常喜歡使用的#like#了 而是 #MATCH# 當(dāng)然據(jù)說(shuō)比like查詢(xún)的速度快上1000倍 具體我沒(méi)有測(cè)試
現(xiàn)在說(shuō)說(shuō)幾個(gè)MATCH在使用的時(shí)候出現(xiàn)的問(wèn)題:
1、如果我們已經(jīng)創(chuàng)建好了一系列的表,新的需求需要使用全文檢索我們是否要重新創(chuàng)建數(shù)據(jù)庫(kù)
2、在使用過(guò)程中個(gè)人認(rèn)為這個(gè)是給外國(guó)人使用的,因?yàn)槭裁茨?,因?yàn)椴樵?xún)的時(shí)候只能查詢(xún)某個(gè)詞,如“SQLite is an ACID compliant embedded relational database management system” 每一個(gè)單詞都是獨(dú)立的、有空格來(lái)分開(kāi)。而中文則不需要由此出現(xiàn)了查詢(xún)不出來(lái)的問(wèn)題
如:

下面來(lái)比較一下like與MATCH
MATCH方式
SELECT * FROM en1 WHERE content MATCH '玩%'
SELECT * FROM en1 WHERE content MATCH '玩*'

like方式:

從而我們證明普通的建表是不可能實(shí)現(xiàn)這個(gè)功能的,那微信、QQ等App都是如果使用的呢?他們是在使用這個(gè)架構(gòu)嗎?
峰會(huì)路轉(zhuǎn)
經(jīng)過(guò)不斷的資料查詢(xún),我找到了
http://www.hustlzp.com/post/2016/02/ios-full-text-search-using-sqlite-fts4?utm_source=tuicool&utm_medium=referral
中文的查詢(xún)我們需要重新定義分詞器:而FMDB給我們提供了相應(yīng)的分詞器:
FMDatabase+FTS3
FMTokenizers
貌似并沒(méi)有多線(xiàn)程的方式,需要自己去重寫(xiě)了,現(xiàn)在我們先嘗試FMDatabase
創(chuàng)建數(shù)據(jù)庫(kù)
[self.dbQueue open];
FMSimpleTokenizer *simpleTok = [[FMSimpleTokenizer alloc] initWithLocale:NULL];
[self.dbQueue installTokenizerModule];
[FMDatabase registerTokenizer:simpleTok withKey:@"simple"];
NSString *sql = [NSString stringWithFormat:@"CREATE VIRTUAL TABLE SQLiteDB USING fts4(content,topic,tokenize=fmdb simple)"];
NSLog(@"----%@",sql);
[self.dbQueue executeUpdate:sql];
[self.dbQueue close];
重新添加數(shù)據(jù):
[self.dbQueue open];
FMSimpleTokenizer *simpleTok = [[FMSimpleTokenizer alloc] initWithLocale:NULL];
[self.dbQueue installTokenizerModule];
[FMDatabase registerTokenizer:simpleTok withKey:@"simple"];
NSString * sql = [NSString stringWithFormat:@"replace INTO SQLiteDB (content,topic) values('%@','%@')",model.content,[self getUUIDString]];
[self.dbQueue executeUpdate:sql];
[self.dbQueue close];
我們這里看到在每個(gè)sql語(yǔ)句之前都有
FMSimpleTokenizer *simpleTok = [[FMSimpleTokenizer alloc] initWithLocale:NULL];
[self.dbQueue installTokenizerModule];
[FMDatabase registerTokenizer:simpleTok withKey:@"simple"];
如果我們使用分詞器創(chuàng)建庫(kù),那么我們?nèi)绻覀儾皇褂盟ヌ砑訑?shù)據(jù)會(huì)報(bào)錯(cuò):
DB Error: 1 "unknown tokenizer: fmdb"
數(shù)據(jù)庫(kù):
C93E2DE2-4D31-4255-B2EA-036347DD9B8E.png
使用可視化的軟件打開(kāi)
SQLiteDB我們無(wú)法查看:unknown tokenizer: fmdb可能是分詞器的原因
content數(shù)據(jù):
4AFA42D0-2B1D-4D36-BEE1-F51DC180D6FD.png
數(shù)據(jù)查詢(xún):
FMSimpleTokenizer *simpleTok = [[FMSimpleTokenizer alloc] initWithLocale:NULL];
[self.dbQueue installTokenizerModule];
[FMDatabase registerTokenizer:simpleTok withKey:@"simple"];
NSString *sql = [[NSString alloc] initWithFormat:@"SELECT * FROM SQLiteDB WHERE SQLiteDB MATCH '%@'", @"人工果醋"];
NSLog(@"-----%@",sql);
FMResultSet *rs = [self.dbQueue executeQuery:sql];
while ([rs next])
{
SQLiteModel *item = [self getMessageResult:rs];
if (item != nil){
[retArr addObject:item];
}
}
[self.dbQueue close];

最后問(wèn)題有來(lái)了......
問(wèn)題來(lái)了 我們發(fā)現(xiàn)在ios8的機(jī)器上查詢(xún)不出結(jié)果!~~~(>_<)~~~
未完待續(xù)..在努力中.....


