sqlite3 fts5 contentless或content=外部表,如何存储和读取非FTS列值

问题描述 投票:0回答:2

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

我的场景=>

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

我做什么=>

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

tableFTS5.textColumn = tableA.textColumn, tableFTS5.textIdColumn = tableA.idColumn, tableFTS5.tableNameColumn = "tableA"
我也使用 tableFTS5.tableNameColumn = "tableB" 对 tableB 重复此操作。

我需要的是=>

我想使用一些搜索文本查询 tableFTS5 的 FTS 索引,并且只想检索 tableFTS5.textIdColumn 和 tableFTS5.tableNameColumn。 有了这两列值,我就可以从 tableA 或 tableB 中检索原始数据。

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

我的信息来源

SQLite3 FTS5 文档链接

database sqlite full-text-search
2个回答
0
投票
好的。所以我可以采取的一种方法是=>

我有两个带有文本数据的主表(我不想重复这些数据)。

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

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

但是使用这种方法我还必须管理 FTS 表和映射表的插入、删除操作。这变得太复杂而难以管理,因此我决定为每个主表创建单独的 FTS 表并设置 content="该主表名称"

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

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

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

我请求开发者将这个选项添加到sqlite中。非常感谢


0
投票
创建一个无内容的 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;
    
© www.soinside.com 2019 - 2024. All rights reserved.