2013-04-23 76 views
2

我需要将FTS添加到现有数据库。外部内容FTS4附加数据库中的表格

开始测试外部内容FTS表,其中FTS索引驻留在默认(主)数据库中。除了一些事情(如索引重建)可能需要相当长的时间以外,一切都运行良好。

然后我读到了将FTS索引放入附加数据库的可能性。这似乎有许多好处,因此我决定尝试一下。但是,我所有的试验都失败了。下面是几个例子:

形势

  • 我们有一个表“账户”用文本列“代码”,并

  • 要创建FTS索引的列和将其放入单独的数据库文件

Test1的)错误: “” 附近:语法错误

ATTACH 'ZipFts.sdf' AS ZipFts; CREATE VIRTUAL TABLE ZipFts.account USING fts4(content=account, code); 
INSERT INTO ZipFts.account(ZipFts.account) VALUES('rebuild'); 

试验2)ERROR:堆栈溢出(源码发动机内无限递归)

ATTACH 'ZipFts.sdf' AS ZipFts; CREATE VIRTUAL TABLE ZipFts.account USING fts4(content=account, code); 
INSERT INTO ZipFts.account(account) VALUES('rebuild'); 

Test3的)错误:没有这样的表:ZipFts.account

ATTACH 'ZipFts.sdf' AS ZipFts; CREATE VIRTUAL TABLE ZipFts.ZipFts_account USING fts4(content="account", code); 
INSERT INTO ZipFts_account(ZipFts_account) VALUES('rebuild'); 

Test4)错误:没有这样的表格:ZipFts.main.account

ATTACH 'ZipFts.sdf' AS ZipFts; CREATE VIRTUAL TABLE ZipFts.ZipFts_account USING fts4(content="main.account", code); 
INSERT INTO ZipFts_account(ZipFts_account) VALUES('rebuild'); 

有人知道这些东西是如何工作的吗?提前致谢。

回答

1

在sqlite3.c中搜索后,我发现可能是答案。

看看函数fts3ReadExprList()的底部。内容表的名称前缀为DB名称!这解释了一切。

此外,这似乎是zContentTbl(=内容表的名称)的唯一非平凡使用。当我稍微修改下面的代码中所示的fts3ReadExprList()函数时,问题就消失了。

// Code inserted by @JS--> 
    // Do not prefix zContentTbl with the database name. The table might reside in main database, for example. 
    if(p->zContentTbl){ 
    fts3Appendf(pRc, &zRet, " FROM '%q' AS x", p->zContentTbl); 
    } 
    else 
    // <[email protected] 
    fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", 
    ... 

请注意,我没有充分测试代码。 (到目前为止,我只知道FTS索引已经创建。)

无论如何,暂时,我认为这是一个SQLite错误,我会尝试继续我的修复。

0

我认为这是按设计。

如果不是这样,外部内容表的基础表可能随着数据库连接或分离而改变。

尽管您可以使用无内容的FTS表来实现此目的。

丹·肯尼迪。

+0

@我认为这是设计的:如果是这样,文档应该纠正。 – 2013-04-24 14:53:52

+0

@外部内容表可能会改变...:不确定你的意思是哪个改变,但实际上FTS索引和内容表之间只有很弱的耦合,即使它们放在同一个数据库中。 – 2013-04-24 14:55:26

+0

@contentless FTS表:没有测试这种索引类型,因为它对我来说看起来没用。例如,不能使用触发器来保持FTS索引是最新的。 – 2013-04-24 14:58:53