【问题标题】:sqlite3 fts5 contentless or content=external table, how store and read a non-FTS column valuesqlite3 fts5 contentless or content=external table,如何存储和读取非FTS列值
【发布时间】:2023-01-29 13:51:08
【问题描述】:

我正在和一个SQLite3数据库。我想创建一个FTS5无内容(content="")或 content="external table" 表以节省空间并防止数据重复(如果我不使用无内容或外部内容表会发生这种情况)。

我的场景=>

tableA (textColumn, idColumn)
tableB (textColumn, idColumn)
tableFTS5 (textColumn, textIdColumn, tableNameColumn)

我做什么 =>

我将数据插入 tableA 和 tableB。 然后我从 tableA 中读取所有行并插入到 tableFTS5 表中

tableFTS5.textColumn = tableA.textColumn, 
tableFTS5.textIdColumn = tableA.idColumn,
tableFTS5.tableNameColumn = "tableA"

我也对表 FTS5.tableName Column = "table" 重复此操作。

我需要的是=>

我想在 tableFTS5 中查询一些文本,我只想检索 tableFTS5.textIdColumn 和 tableFTS5.tableNameColumn。 有了这两个列值,我就可以从 tableA 或 tableB 中检索原始数据。

如果 tableFTS5 是无内容表或 content="external" 表,是否可以从 tableFTS5 中检索这些列,可能使用某些触发器或任何其他方法?

我的信息来源Link to SQLite3 FTS5 docs

【问题讨论】:

    标签: database sqlite full-text-search full-text-indexing


    【解决方案1】:

    行。所以我可以采取的一种方法是=>

    我有两个包含文本数据的主表(我不想复制这些数据)。

    我创建了一个映射表来将主表名称及其文本 ID 映射到 FTS 表的 rowid。

    我有一个 FTS 无内容表,它只返回 rowid。

    但是通过这种方法,我也必须管理 FTS 表和映射表的插入、删除操作。这太复杂了,无法管理,所以我决定为每个主表创建单独的 FTS 表并设置 content="that main table name"

    但我真的更喜欢无内容的 FTS 表是否有一个选项来存储和返回一些用户指定的列,目的是存储一些 id 而不是文本内容列(因为这会造成文本重复)。

    我试图实现的是所谓的一对一多态关系,因此我不必创建太多表。

    如果我为无内容 FTS 表选择了这个选项,那么对于 6 个文本数据表,我将只创建一个 FTS 表,因此总表数 = 7。 但是现在如果没有这个选项,我会创建 12 个表,6 个主表和 6 个 FTS

    我要求开发人员将此选项添加到 sqlite。非常感谢

    【讨论】:

      【解决方案2】:

      创建一个无内容的 fts5 表:

      CREATE VIRTUAL TABLE IF NOT EXISTS fts_tbl USING fts5(a, b, c, content='')
      

      创建触发器,以便它更新为您想要索引更新的表:

      CREATE TRIGGER IF NOT EXISTS tbl_ai AFTER INSERT ON tbl BEGIN INSERT INTO fts_tbl(rowid, a, b, c) VALUES (new.ROWID, new.a, new.b, new.c); END
      CREATE TRIGGER IF NOT EXISTS tbl_ad AFTER DELETE ON tbl BEGIN INSERT INTO fts_tbl(fts_tbl, rowid, a, b ,c) VALUES('delete', old.ROWID, old.a, old.b, old.c); END
      CREATE TRIGGER IF NOT EXISTS tbl_au AFTER UPDATE ON tbl BEGIN INSERT INTO fts_tbl(fts_tbl, rowid, a, b, c) VALUES('delete', old.ROWID, old.a, old.b, old.c); INSERT INTO fts_tbl(rowid, a, b, c) VALUES (new.ROWID, new.a, new.b, new.c); END
      

      然后用您感兴趣的表中的数据填充它:

      INSERT INTO fts5_tbl (rowid, a, b, c) SELECT ROWID, a, b, c FROM tbl
      

      现在您可以查询它并从您的表中返回数据,如下所示:

      select rank, t.a, t.b, t.c from tbl t join fts_tbl f on t.ROWID = f.ROWID where fts_tbl MATCH "search" order by rank;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-13
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 1970-01-01
        • 2019-09-11
        • 2020-10-12
        相关资源
        最近更新 更多