代码之家  ›  专栏  ›  技术社区  ›  alex2k8

如何从FTS3表搜索中排除列

  •  6
  • alex2k8  · 技术社区  · 15 年前

    CREATE VIRTUAL TABLE t USING FTS3(hidden, 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'
    

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

    我将使用“hidden”列来引用具有附加信息的辅助表中的行。

    2 回复  |  直到 15 年前
        1
  •  6
  •   Paul Wheeler    15 年前

    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';
    
        2
  •  11
  •   Luke Redpath    12 年前

    notindexed 选项,例如:

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

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

    我还通过嵌入自己的SQLite 3.8版本在iOS上实现了这一点。

    Documentation for notindexed option

    推荐文章