在 SQLite 中为全文搜索索引创建 SQL 触发器

Posted

技术标签:

【中文标题】在 SQLite 中为全文搜索索引创建 SQL 触发器【英文标题】:Creating SQL triggers for full text search index in SQLite 【发布时间】:2016-02-26 06:14:24 【问题描述】:

我正在尝试为常规表创建触发器,然后更新 SQLite 中的全文索引,但我遇到了一些错误,我不确定我哪里出错了。

我正在制作的应用程序是一个书签应用程序,我保存书签数据的数据库是使用以下 SQL 语句创建的:

create table "pages" (
  "pageUrl" text not null unique on conflict replace, 
  "dateCreated" integer not null, 
  "pageDomain" text not null, 
  "pageTitle" text null, 
  "pageText" text null, 
  "pageDescription" text null, 
  "archiveLink" text null, 
  "safeBrowsing" text null, 
  primary key ("pageUrl")
);

然后创建全文搜索索引:

create virtual table fts using fts5(
  content='pages', 
  content_rowid='pageUrl', 
  pageDomain, 
  pageTitle, 
  pageText, 
  pageDescription
);

那么我想在“pages”表通过插入或删除更新时更新 fts 索引。

插入的触发器:

create trigger afterPagesInsert after insert on pages begin
  insert into fts(
    rowid, 
    pageDomain, 
    pageTitle, 
    pageText, 
    pageDescription
  )
  values(
    new.pageUrl, 
    new.pageDomain, 
    new.pageTitle, 
    new.pageText, 
    new.pageDescription
  );
end;

删除的触发器:

create trigger afterPagesDelete after delete on pages begin
  insert into fts(
    fts,
    rowid,
    pageDomain,
    pageTitle,
    pageText,
    pageDescription
  )
  values(
    'delete',
    old.pageUrl,
    old.pageDomain,
    old.pageTitle,
    old.pageText,
    old.pageDescription
  );
end;

这是我正在使用的 sql 插入语句的示例:

insert into "pages" (
  "pageUrl",
  "dateCreated",
  "pageDomain",
  "pageTitle",
  "pageText",
  "pageDescription",
  "archiveLink",
  "safeBrowsing"
  )
values(
  'https://www.reddit.com/',
  1456465040177,
  'reddit.com',
  'reddit: the front page of the internet',
  'reddit: the front page of the internet',
  'reddit: the front page of the internet',
  NULL,
  NULL
  )

还有delete语句:

delete from "pages" where "pageUrl" = 'https://www.reddit.com/'

但是,插入和删除触发器都出现SQLITE_MISMATCH: datatype mismatch] errno: 20, code: 'SQLITE_MISMATCH' 错误,我猜这似乎表明错误的数据进入了错误的列,但我不确定为什么。我已经浏览了 docs here 的外部内容表部分中的触发器部分,并且我已经按照列出的内容进行操作,所以我不确定我哪里出错了。

任何帮助将不胜感激。

注意:我使用的是 fts5 版本的 SQLite 全文搜索:https://www.sqlite.org/fts5.html

【问题讨论】:

【参考方案1】:

content_rowid 必须引用实际表的rowid,即 INTEGER PRIMARY KEY 列。

【讨论】:

以上是关于在 SQLite 中为全文搜索索引创建 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 全文搜索

sql 在表上创建全文搜索索引

在 PostgreSQL 上使用 SQLAlchemy 创建全文搜索索引

用于全文搜索的 SQL Server 索引视图

Sql Server 数据库建全文搜索

Jackrabbit Oak Lucine 索引和 SQL2 查询,用于在 txt 和 pdf 中进行全文搜索