我可以在 FTS 查询中使用 AND 语句吗?



在虚拟表中的索引列上使用 AND 语句执行查询时,是否仍然可以在 SQLite 中享受 FTS3/4 的好处?例:

SELECT title, ID, creationDate FROM documents WHERE type=1 AND status=2 AND searchableFields MATCHES '"john doe"';

SELECT title, ID, creationDate FROM documents WHERE type=1 AND status=2 AND searchableFields CONTAINS 'john doe';

类型和状态在虚拟表中建立索引的位置。

FTS 表中的所有列都是文本列,并且是 FTS 索引的;文档说:

如果作为 CREATE VIRTUAL TABLE 语句的一部分为 FTS 表显式提供了列名,则可以选择为每个列指定数据类型名称。这是纯粹的语法糖,提供的字体名称不会被FTS或SQLite核心用于任何目的。

您不应像在 FTS 表上type=1那样执行搜索:

可以使用两种不同形式的 SELECT 语句有效地查询 FTS 表:

  • 按行查询。如果 SELECT 语句的 WHERE 子句包含形式为 "rowid = ?" 的子句,则 ?是一个SQL表达式,FTS能够使用相当于SQLite整数主键索引直接检索请求的行。
  • 全文查询。如果 SELECT 语句的 WHERE 子句包含形式为"MATCH?"的子句,则 FTS 能够使用内置的全文索引将搜索限制为与指定为 MATCH 子句的右操作数的全文查询字符串匹配的文档。

如果这两种查询策略都不能使用,则使用整个表的线性扫描来实现对 FTS 表的所有查询。如果表包含大量数据,这可能是不切实际的方法。

不应将 FTS 表视为表,而应将其视为索引。

如果要存储非文本数据,则应使用单独的普通表,并单独查询:

SELECT title, ID, creationDate
FROM documents
WHERE type=1
AND status=2
AND ID IN (SELECT docid
FROM documents_FTS
WHERE searchableFields MATCH '"john doe"');

若要避免将相同的数据存储两次,可以使用无内容表或外部内容表。

最新更新