Frage

Ich habe solche Tabelle:

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

Ich mag Benutzer in der Lage sein searh über ‚text1‘ und ‚text2‘ Spalten, so dass die Abfrage

SELECT docid FROM t WHERE t MATCH ?

Und mögliche Anfragen sind:

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

Frage: Wie kann ich ausschließen ‚versteckte‘ Spalte von Suche, so dass Benutzer keine Zeilen von verstecktem Wert finden können?

Ich werde Gebrauch ‚versteckte‘ Spalte Zeilen in der sekundären Tabelle mit zusätzlichen Informationen beziehen.

War es hilfreich?

Lösung

Eine FTS3 Tabelle erhält eine freie 64-Bit-Integer-Spalte namens docId die nicht indiziert ist. stellen zusätzliche Daten in einer separaten Tabelle einfach, wo der Primärschlüssel für diese Tabelle die gleiche wie die docid für die FTS3 Tabelle ist.

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';

Andere Tipps

Alt Faden, aber wenn Sie eine neuere Version von SQLite (> 3.8) verwenden, können Sie jetzt die notindexed Option verwenden, z.

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

Dies wird die Spalte von Match-Abfragen ausschließen.

Ich habe auch diese Arbeit auf iOS durch meine eigene Version von SQLite 3.8 eingebettet wird.

Dokumentation für notindexed Option

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top