2010-10-12 4 views
6

Je telle table:Comment exclure la colonne de la table FTS3 recherche

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

Je voudrais utilisateur de pouvoir searh sur « text1 » et colonnes « text2 », de sorte que la requête est

SELECT docid FROM t WHERE t MATCH ? 

et les demandes sont possibles:

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

Q: comment puis-je exclure la colonne « cachée » de la recherche, de sorte que l'utilisateur ne peut pas trouver les lignes par valeur cachée?

Je vais utiliser la colonne 'hidden' pour faire référence aux lignes du tableau secondaire avec des informations supplémentaires.

Répondre

6

Une table FTS3 obtient une colonne entière de 64 bits libre appelée docid qui n'est pas indexée. Ajoutez simplement des données supplémentaires dans une table distincte où la clé primaire pour cette table est identique à la docid pour la table FTS3.

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

fil vieux, mais si vous utilisez une version plus récente de SQLite (> 3.8), vous pouvez maintenant utiliser l'option notindexed, par exemple:

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

Cela exclut la colonne de correspondance requêtes.

J'ai aussi travaillé sur iOS en embarquant ma propre version de SQLite 3.8.

Documentation for notindexed option

Questions connexes