Come escludere colonna dalla FTS3 Ricerca tavolo
Domanda
Non ho tale tabella:
CREATE VIRTUAL TABLE t USING FTS3(hidden, text1, text2)
vorrei utente sia in grado di searh over 'text1' e '' text2 colonne, in modo che la query è
SELECT docid FROM t WHERE t MATCH ?
e richieste possibili sono:
SELECT docid FROM t WHERE t MATCH 'foo'
SELECT docid FROM t WHERE t MATCH 'text1:foo OR text2:bar'
D: come posso escludere 'nascosto' colonna dalla ricerca, in modo che l'utente non riesce a trovare le righe di valore nascosto?
Ho intenzione di uso 'nascosto' colonna per fare riferimento a righe in tabella secondaria con informazioni aggiuntive.
Soluzione
tavolo Un FTS3 ottiene un libero colonna intero a 64 bit chiamato docid non è indicizzato. In poche parole dati aggiuntivi in ??una tabella separata, dove la chiave primaria per quel tavolo è lo stesso del docid per la tabella 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';
Altri suggerimenti
thread vecchio, ma se si sta utilizzando una build più recente di SQLite (> 3.8), è ora possibile utilizzare l'opzione notindexed
, per esempio:.
CREATE VIRTUAL TABLE t USING FTS4(uuid, document, notindexed=uuid);
Questo esclude la colonna dalla query partita.
Inoltre ho ottenuto questo lavoro su iOS, grazie all'integrazione di mia build di SQLite 3.8.