如何从FTS3表搜索中排除列

时间:2010-10-12 13:35:08

标签: sqlite fts3

我有这样的表:

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'

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

我将使用'hidden'列来引用辅助表中的行以及其他信息。

2 个答案:

答案 0 :(得分:11)

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

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

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

我也通过嵌入我自己的SQLite 3.8版本在iOS上工作。

Documentation for notindexed option

答案 1 :(得分:6)

FTS3表获取一个名为docid的空闲64位整数列,该列未编入索引。只需将其他数据放在一个单独的表中,该表的主键与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';