Получить инвертированный индекс из таблицы SQLite FTS - PullRequest
5 голосов
/ 11 марта 2012

После того, как я реализовал функцию полнотекстового поиска в своем приложении с использованием таблиц Sqlite и FTS, меня заинтересовал бы эффективный способ извлечения ПОЛНОГО инвертированного индекса из моей таблицы FTS. По сути - мне нужна таблица результатов, включающая сопоставление между всеми терминами -> docid's -> количество вхождений.

По документации Sqlite FTS - после создания таблиц

-- Create an FTS4 table
CREATE VIRTUAL TABLE ft USING fts4(x, y);

-- Create an fts4aux table to access the full-text index for table "ft"
CREATE VIRTUAL TABLE ft_terms USING fts4aux(ft);

... и вставка контента ...

INSERT INTO ft(x, y) VALUES('Apple banana', 'Cherry');
INSERT INTO ft(x, y) VALUES('Banana Date Date', 'cherry');
INSERT INTO ft(x, y) VALUES('Cherry Elderberry', 'Elderberry');

... вместо просто терминов и количества вхождений для всех документов, как в таблице FUX AUX ...

SELECT term, col, documents, occurrences FROM ft_terms;

--     apple       |  *  |  1  |  1
--     apple       |  0  |  1  |  1
--     banana      |  *  |  2  |  2
--     banana      |  0  |  2  |  2
--     cherry      |  *  |  3  |  3
--     cherry      |  0  |  1  |  1
--     cherry      |  1  |  2  |  2
--     date        |  *  |  1  |  2
--     date        |  0  |  1  |  2
--     elderberry  |  *  |  1  |  2
--     elderberry  |  1  |  1  |  1
--     elderberry  |  1  |  1  |  1

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

           Term    |col  |docid| occurences
------------------------------------------
--     apple       |  0  |  1  |  1
--     banana      |  0  |  2  |  1
--     cherry      |  0  |  3  |  1
--     cherry      |  1  |  1  |  1
--     cherry      |  1  |  2  |  1
--     date        |  0  |  2  |  2
--     elderberry  |  0  |  3  |  1
--     elderberry  |  1  |  3  |  1

Я до сих пор не уверен, достаточно ли эффективен простой запрос на совпадение по всем терминам в коллекции документов - может быть, есть более прямой путь?

...