2010-10-12 18 views
6

tengo tales tabla:Cómo excluir la columna de FTS3 búsqueda en la tabla

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

Quisiera usuario sea capaz de Searh sobre 'texto1' y columnas 'text2', por lo que la consulta es

SELECT docid FROM t WHERE t MATCH ? 

y posibles necesidades son:

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

Q: ¿Cómo puedo excluir la columna 'oculta' de búsqueda, por lo que el usuario no puede encontrar filas por valor oculto?

Voy a utilizar la columna "oculto" para referirme a las filas en la tabla secundaria con información adicional.

Respuesta

6

Una tabla FTS3 obtiene una columna entera de 64 bits llamada docid que no está indexada. Simplemente coloque datos adicionales en una tabla separada donde la clave principal para esa tabla es la misma que para la tabla 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'; 
11

hilo viejo, pero si usted está utilizando una compilación más nueva de SQLite (> 3,8), ahora se puede utilizar la opción notindexed, por ejemplo:

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

Esto excluirá la columna del partido consultas.

También tengo esto trabajando en iOS incorporando mi propia compilación de SQLite 3.8.

Documentation for notindexed option

Cuestiones relacionadas