SQLite 正则表和 fts 表

Posted

技术标签:

【中文标题】SQLite 正则表和 fts 表【英文标题】:SQLite regular table and table for fts 【发布时间】:2013-10-28 12:10:25 【问题描述】:

我有表 news (id, news_id, news_title) 并且我创建了 FTS 表:

CREATE VIRTUAL TABLE news_search USING fts4 (news_title, tokenize=porter);

我使用触发器来保持表 NEWS 和 news_search 同步:

CREATE TRIGGER IF NOT EXISTS insert_news_trigger 
AFTER INSERT ON news 
BEGIN 
INSERT OR IGNORE INTO news_search (news_title) VALUES (NEW.news_title);
END;

问题:如何使用搜索?当我在 news_search 表中执行 MATCH 时,它只返回该表中的记录,但我需要 news 表中的 *news_id*。可能我应该将 *news_id* 列添加到 news_search 表中吗?

在 sqlite 中使用 fts 的正确方法是什么?

【问题讨论】:

【参考方案1】:

阅读documentation; FTS 表还有一个rowid 列(也称为docid),您可以将其显式设置为与原始表的相应键相同的值。

假设 news.idrowid(即 INTEGER PRIMARY KEY),您应该更改触发器,将该 ID 值也复制到 news_search 表中。 您可以使用它来查找原始记录:

SELECT *
FROM news
WHERE id IN (SELECT docid
             FROM news_search
             WHERE news_title MATCH '?')

【讨论】:

以上是关于SQLite 正则表和 fts 表的主要内容,如果未能解决你的问题,请参考以下文章

对 SQLite 表和虚拟表的困惑

Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配

SQlite 全文搜索(FTS)?

如何最好地将多个文本文件导入 SQLite FTS 虚拟表?

没有这样的模块:fts4aux-查询使用 fts4aux 创建的 sqlite 虚拟表时出错

FTS4 SQLITE 中的外部内容