2010-10-12 11 views
6

ich eine solche Tabelle haben:Wie Spalte von FTS3 Tabelle Suche auszuschließen

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

ich Benutzer searh über ‚text1‘ in der Lage sein möchte und ‚text2‘ Spalten, so dass die Abfrage ist

SELECT docid FROM t WHERE t MATCH ? 

und mögliche Fragestellungen sind:

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

Q: wie kann ich ‚versteckte‘ Spalte von der Suche ausgeschlossen werden, so dass Benutzer keine Zeilen von verstecktem Wert finden können?

Ich werde 'versteckte' Spalte verwenden, um auf Zeilen in der sekundären Tabelle mit zusätzlichen Informationen verweisen.

Antwort

6

Eine FTS3-Tabelle erhält eine freie 64-Bit-Integerspalte namens Docid, die nicht indiziert ist. Fügen Sie einfach zusätzliche Daten in eine separate Tabelle ein, in der der Primärschlüssel für diese Tabelle derselbe ist wie für die Docid für die FTS3-Tabelle.

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

Alt Faden, aber wenn Sie eine neuere Version von SQLite (> 3.8) verwenden, können Sie nun mit der notindexed Option, zB:

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

Dies wird die Spalte von Spiel ausschließen Abfragen.

Ich habe auch das funktioniert auf iOS durch die Einbettung meiner eigenen Build von SQLite 3.8.

Documentation for notindexed option

Verwandte Themen