iOS__SQLite FTS3 and FTS4

最近項(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)的索引吧)

11DE9BA9-7662-469B-BC4F-EC279409CA10.png

插入數(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)題
如:


![B6C6E4D4-43E2-4E74-956D-F0AC1B13B0BD.png](http://upload-images.jianshu.io/upload_images/1117002-907a2f347fe99b12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下面來(lái)比較一下like與MATCH

MATCH方式
SELECT * FROM en1 WHERE content MATCH '玩%'
SELECT * FROM en1 WHERE content MATCH '玩*'
D3BCAAF7-48D1-4C86-9E8A-C634DA72C1EE.png
like方式:
E807CE1B-4B7A-4934-8722-FF045888EEF5.png

從而我們證明普通的建表是不可能實(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];
54D3A40C-88A8-44DC-AB50-A4BC6DB6ED26.png
最后問(wèn)題有來(lái)了......

問(wèn)題來(lái)了 我們發(fā)現(xiàn)在ios8的機(jī)器上查詢(xún)不出結(jié)果!~~~(>_<)~~~

未完待續(xù)..在努力中.....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 我們的APP部分功能為了滿(mǎn)足用戶(hù)離線(xiàn)使用搜索的場(chǎng)景,使用了內(nèi)置SQLite數(shù)據(jù)庫(kù)的方式,隨著內(nèi)容的日益豐富,...
    wentianen閱讀 13,847評(píng)論 22 20
  • 隨著app信息量越來(lái)越大,每次從網(wǎng)絡(luò)獲取數(shù)據(jù)已經(jīng)不是很可取的方案了,本地?cái)?shù)據(jù)庫(kù)的運(yùn)用已經(jīng)越來(lái)越普遍了。而說(shuō)道移動(dòng)端...
    taosiyu閱讀 4,804評(píng)論 12 13
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,083評(píng)論 4 61
  • 然后又是一位同學(xué)介紹,他叫小R,他是個(gè)帥氣的小伙子,白凈的皮膚,對(duì)稱(chēng)的面龐,愛(ài)笑的眼睛,也喜歡說(shuō)話(huà),穿花色...
    睿淵閱讀 257評(píng)論 0 2
  • 如果有那么一個(gè)地方,離自己的家鄉(xiāng)不過(guò)兩小時(shí)車(chē)程,讓我暫時(shí)遠(yuǎn)離大城市的喧囂,享受幾天行攝山水間,品茶閱讀嘗農(nóng)家菜,又...
    Joeyguan閱讀 544評(píng)論 2 2

友情鏈接更多精彩內(nèi)容