附加数据库中的外部内容FTS4表

时间:2013-04-23 14:19:06

标签: sqlite

我需要将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');

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

2 个答案:

答案 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表来实现这一目标。

丹肯尼迪。