Как запросить таблицу внешнего контента FTS4, но вернуть дополнительные столбцы из исходной таблицы контента

Я создаю таблицу внешнего содержимого FTS4 в SQLite следующим образом:

CREATE TABLE t2(id INTEGER PRIMARY KEY, col_a, col_b, col_text);
CREATE VIRTUAL TABLE fts_table USING fts4(content="t2", col_text);

Я использую таблицу внешнего содержимого, поэтому мне не нужно хранить повторяющиеся значения col_text в fts_table, Я только индексирую col_text так как col_a а также col_b не нужно индексировать

Тем не менее, когда я делаю запрос fts_table как это

SELECT * FROM fts_table WHERE fts_table MATCH 'something';

У меня нет доступа к col_a а также col_b из таблицы содержимого t2, Как вернуть все эти столбцы (col_a, col_b, col_text) из одного запроса FTS?

Обновить

Я пытался использовать notindexed=column_name вариант как в

CREATE VIRTUAL TABLE fts_table USING fts4(content="t2", col_a, col_b, col_text, notindexed=col_a, notindexed=col_b);

Это должно работать для некоторых людей, но я использую его в Android и notindexed опция не поддерживается до SQLite 3.8, которую Android не поддерживает до версии Android 5.x. И мне нужно поддерживать Android 4.x. Я обновляю этот вопрос, чтобы включить тег Android.

1 ответ

Решение

Таблицы FTS имеют внутренний столбец INTEGER PRIMARY KEY, который называется docid или же rowid, При вставке строки в таблицу FTS установите для этого столбца первичный ключ строки в исходной таблице.

Затем вы можете легко найти соответствующую строку, либо с помощью отдельного запроса, либо с помощью соединения следующим образом:

SELECT *
FROM t2
WHERE id IN (SELECT docid
             FROM fts_table
             WHERE col_text MATCH 'something')
Другие вопросы по тегам