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.

Était-ce utile?

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.

Documentation pour l'option notindexed

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top