Comment exclure la colonne de recherche de table FTS3
Question
Je tel tableau:
CREATE VIRTUAL TABLE t USING FTS3(hidden, text1, text2)
Je voudrais utilisateur de pouvoir sur searh « text1 » et « » texte2 colonnes, de sorte que la requête est
SELECT docid FROM t WHERE t MATCH ?
Et les demandes possibles sont:
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 de valeur cachée?
Je vais utiliser « caché » la colonne de se référer aux lignes dans le tableau secondaire avec des informations supplémentaires.
La solution
Tableau Une FTS3 obtient une colonne d'entiers de 64 bits libre appelé docid qui ne sont pas indexés. Tout simplement des données supplémentaires dans une table séparée où la clé primaire de cette table est le même que le 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';
Autres conseils
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);
exclura la colonne des requêtes de match.
J'ai aussi ce travail sur iOS en intégrant ma propre version de SQLite 3.8.