【问题标题】:External Content FTS4 Tables in an attached database附加数据库中的外部内容 FTS4 表
【发布时间】:2013-04-23 14:19:06
【问题描述】:

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

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

【问题讨论】:

    标签: sqlite


    【解决方案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
      // <--@JS
      fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", 
      ...
    

    请注意,我没有充分测试代码。 (目前我只知道 FTS 索引创建好了。)

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

    【讨论】:

      【解决方案2】:

      我认为这是设计的。

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

      不过,您也许可以使用无内容的 FTS 表来实现这一点。

      丹·肯尼迪。

      【讨论】:

      • @我认为这是设计的:如果是这样,应该更正文档。
      • @external content table could change...:不确定您的意思是哪个更改,但实际上 FTS 索引和内容表之间的耦合非常弱,即使它们被放置在相同的数据库。
      • @contentless FTS 表:没有测试这个索引类型,因为它看起来对我没用。例如,不能使用触发器来保持 FTS 索引是最新的。
      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2014-04-12
      • 1970-01-01
      相关资源
      最近更新 更多