2010-10-12 24 views
6

排除專欄中,我有這樣的表:如何從FTS3表搜索

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

我希望用戶能夠searh在「文本1」和「文本2」列,因此該查詢

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' 

問:我怎樣才能排除「隱藏」從搜索欄,使用戶無法通過隱藏的價值發現行?

我將使用'隱藏'列來引用輔助表中的行與附加信息。

回答

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'; 
11

舊線,但如果你使用SQLite(> 3.8)的新版本,您現在可以使用notindexed選項,如:

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

這將排除匹配列查詢。

我也通過嵌入我自己的SQLite 3.8構建了iOS上的這個工作。

Documentation for notindexed option