【问题标题】:Sqlite using fts5 table to perform all queries instead of main tableSqlite 使用 fts5 表代替主表来执行所有查询
【发布时间】:2021-10-11 01:41:56
【问题描述】:

假设我有两个表:usersusers_fts 其中users_fts 是搜索表。所以users 有两个字段namesurname

通常我会为这两个 em' 创建索引。但既然我有users_fts,我是否需要在users 中为namesurname 创建索引?使用users_fts 执行所有查询而不是使用主表users 是否有任何警告?

【问题讨论】:

    标签: sqlite datatable android-sqlite ios-sqlite


    【解决方案1】:

    SQLite 提供全文搜索,我假设这就是您从表名中使用的内容。我将使用 FTS5 显示示例代码,但如果需要,您可以向后调整它。如果您有一个 users 表,例如:

    CREATE TABLE users(
        id INTEGER PRIMARY KEY, 
        name TEXT NOT NULL, 
        surname TEXT NOT NULL
    );
    

    然后您使用以下内容创建了全文搜索表:

    CREATE VIRTUAL TABLE users_fts USING fts5(
        name, 
        surname, 
        content='user', 
        content_rowid='id'
    );
    

    此时,您必须确保为全文搜索建立了users 表中的记录的索引,这可以使用users 表上的触发器自动完成。触发器如下所示:

    CREATE TRIGGER users_ai AFTER INSERT ON users
        BEGIN
            INSERT INTO users_fts (rowid, name, surname)
            VALUES (new.id, new.name, new.surname);
        END;
    
    CREATE TRIGGER users_ad AFTER DELETE ON users
        BEGIN
            INSERT INTO users_fts (users_fts, rowid, name, surname)
            VALUES ('delete', old.id, old.name, old.surname);
        END;
    
    CREATE TRIGGER users_au AFTER UPDATE ON users
        BEGIN
            INSERT INTO users_fts (users_fts, rowid, name, surname)
            VALUES ('delete', old.id, old.name, old.surname);
            INSERT INTO users_fts (rowid, name, surname)
            VALUES (new.id, new.name, new.surname);
        END;
    

    完成所有这些后,您现在可以使用users_fts 表执行全文搜索。

    那么users 表上的索引如何影响users_fts 表呢?如果您只使用users_fts 表进行搜索,则users 表上的索引无关紧要。我不知道您打算如何填充users_fts 表,但如果您在users 表上使用触发器,那么users 表上的建议索引仍然无关紧要。如果您手动使users_fts 表保持最新状态,那么答案是users 表上的索引可能会影响性能。我认识的大多数人都使用触发器方法,这就是我所做的,它让您忘记手动维护全文搜索,并且您可以获得额外的好处,您可以在填充全文搜索时忽略源表上的索引。请记住,虽然这是您根本不查询 users 表的场景 - 如果您对 users 表有任何查询,那么您可能需要支持索引。

    您还询问了使用users_fts 表进行查询的方法是否有任何注意事项 - 只要您保持users_fts 表为最新,那么这种方法就没有缺点。如果您需要全文搜索功能和排名,这是一种融入 SQLite 的非常方便的方法。这将需要更多的存储空间,但您可以通过使用外部内容表来最小化这种影响(我在创建 users_fts 表时展示了这一点)。您可以在https://www.sqlite.org/fts5.htmlhttps://www.sqlite.org/fts5.html的 FTS5 扩展文档的第 4.4.2 节中阅读有关它的一些详细信息

    这种方法适用于全文搜索功能,只要您维护索引,它应该可以很好地工作并为您提供更多搜索和排名功能。根据我的经验,大多数全文搜索都比使用标准 SQL 函数和运算符(例如 LIKE 等)更快,而且功能更强大。

    【讨论】:

    • 非常感谢。这消除了我的疑虑。
    猜你喜欢
    • 2022-11-29
    • 2022-07-14
    • 2021-10-09
    • 2015-02-13
    • 2021-11-28
    • 2017-06-24
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多