我需要将FTS添加到现有数据库中。
开始测试外部内容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)错误:堆栈溢出(sqlite引擎内无限递归)
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');
有人知道这些东西是如何运作的吗?提前谢谢。
答案 0 :(得分:1)
在sqlite3.c中进行了一些搜索后,我找到了可能的答案。
查看函数fts3ReadExprList()的底部。内容表的名称在此处以数据库名称为前缀!这解释了一切。
此外,这似乎是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
// <--@JS
fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x",
...
请注意,我没有充分测试代码。 (到目前为止,我只知道创建了FTS索引。)
无论如何,暂时,我认为这是一个SQLite错误,我会继续尝试修复。
答案 1 :(得分:0)
我认为这是按照设计的。
如果不是这样,外部内容表的基础表可能会随着数据库的连接或分离而改变。
您可以使用无内容的FTS表来实现这一目标。
丹肯尼迪。