6

我有这样的表:

CREATE VIRTUAL TABLE t USING FTS3(hidden, text1, text2)

我希望用户能够搜索“text1”和“text2”列,所以查询是

SELECT docid FROM t WHERE t MATCH ?

可能的要求是:

SELECT docid FROM t WHERE t MATCH 'foo'
SELECT docid FROM t WHERE t MATCH 'text1:foo OR text2:bar'

问:如何从搜索中排除“隐藏”列,使用户无法通过隐藏值找到行?

我将使用“隐藏”列来引用辅助表中的行以及其他信息。

4

2 回答 2

13

旧线程,但如果您使用的是较新版本的 SQLite (> 3.8),您现在可以使用该notindexed选项,例如:

CREATE VIRTUAL TABLE t USING FTS4(uuid, document, notindexed=uuid);

这将从匹配查询中排除该列。

通过嵌入我自己构建的 SQLite 3.8,我也可以在 iOS 上使用它。

未索引选项的文档

于 2013-08-30T11:08:52.740 回答
6

FTS3 表有一个免费的 64 位整数列,称为 docid,它没有被索引。只需将附加数据放在单独的表中,该表的主键与 FTS3 表的 docid 相同。

CREATE VIRTUAL TABLE t USING FTS3(text1, text2);

CREATE TABLE additional (id INTEGER PRIMARY KEY, hidden VARCHAR);

INSERT INTO t (docid, text1, text2) VALUES (243, 'foo', 'bar');
INSERT INTO additional VALUES (243, 'bas');

SELECT docid, text1, text2, hidden FROM t JOIN additional ON t.docid = additional.id WHERE t MATCH 'foo';
于 2010-11-05T22:47:14.353 回答