2010-10-12 4 views
6

У меня есть такая таблица:Как исключить столбец из FTS3 поиска таблицы

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

Я хотел бы, чтобы пользователь смог searh над «text1» и столбцы «TEXT2», поэтому запрос

SELECT docid FROM t WHERE t MATCH ? 

И возможные запросы:

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

Q: как я могу исключить «скрытый» столбец из поиска, так что пользователь не может найти строки скрытого значения?

Я собираюсь использовать «скрытый» столбец для ссылки на строки в дополнительной таблице с дополнительной информацией.

ответ

6

Таблица FTS3 получает бесплатный 64-разрядный целочисленный столбец, называемый docid, который не индексируется. Просто добавьте дополнительные данные в отдельную таблицу, где первичный ключ для этой таблицы совпадает с документом docid для таблицы 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

Старая нить, но если вы используете более новую сборку SQLite (> 3.8), теперь вы можете использовать notindexed вариант, например:

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

Это исключит столбец из матча запросы.

У меня также есть эта работа на iOS, встраивая мою собственную сборку SQLite 3.8.

Documentation for notindexed option

Смежные вопросы