Полнотекстовая виртуальная таблица SQLite обычно используется?

Даже после прочтения многого о полнотекстовом индексе SQLite и возникает вопрос, который я не видел нигде:

У меня уже есть таблица, которую я хочу искать с полным текстом. Я бы просто создал дополнительную виртуальную таблицу USING FTS3 или USING FTS4, а затем INSERT мои данные в нее.

Использует ли это двойное хранилище? Можно ли использовать такую ​​виртуальную таблицу, как обычную таблицу, и тем самым предотвратить сохранение данных дважды?

(Я работаю с SQLite на Android, но этот вопрос может применяться к использованию на любой совместимой с SQLite платформой.)

Ответ 1

Несмотря на то, что вы нашли некоторые подробности, я попытаюсь предоставить подробный ответ:

1. Использует ли это использование двойного хранилища?

Да, да. Кроме того, он может использовать событие больше пространства. Например, для широко известного набора данных Enron E-Mail Dataset и FTS3 просто почувствуйте разницу:

enter image description here

  • Таблица FTS3 потребляет около 200 МБ на диске по сравнению с просто 1453 МБ для обычной таблицы

  • Таблица FTS3 заняла чуть меньше 31 минут для заполнения, против 25 для обычной таблицы

Это делает ситуацию немного неприятной, но все равно полнотекстовый поиск стоит того.

2. Можно ли использовать такую ​​виртуальную таблицу, как обычную таблицу?

Короткий ответ нет, вы не можете. Виртуальная таблица - это просто какой-то вид с несколькими ограничениями. Вы уже заметили несколько.

Как правило, вы не должны использовать какую-либо функцию, которая кажется неестественной для представления. Только минимальный минимум, необходимый для того, чтобы ваше приложение полностью использовало полнотекстовый поиск. Так что сюрпризов не будет позже, с более новой версией модуля.

Для этого решения нет волшебства, это всего лишь компромисс между производительностью, требуемым дисковым пространством и функциональностью.

Окончательный вывод

Я бы очень рекомендовал использовать FTS4, потому что он быстрее, и единственным недостатком является дополнительное пространство для хранения.

В любом случае вам необходимо тщательно разработать виртуальную таблицу с учетом дополнительного и узкоспециального характера такого решения. Другими словами, не пытайтесь заменить свою начальную таблицу на виртуальную. Используйте оба с большой осторожностью.

Обновление Я бы рекомендовал просмотреть следующую статью: полнотекстовый поиск iOS с основными данными и SQLite. Несколько интересных моментов:

  • Виртуальная таблица создается в той же базе данных SQLite, в которой находится содержимое основных данных. Чтобы эта таблица была как можно более легкой вставляются только свойства объекта, относящиеся к поисковому запросу.
  • Реализация SQLite предлагает то, что Core Data не выполняет: полнотекстовый поиск. Кроме того, он выполняет почти на 10% быстрее и, по крайней мере, На 660% больше (памяти), чем сопоставимый запрос Core Data.

Ответ 2

Я только что узнал основные различия в виртуальных таблицах и, похоже, зависит от вашего использования, достаточно ли вам одной таблицы.

  • Невозможно создать триггер в виртуальной таблице.

  • Нельзя создавать дополнительные индексы на виртуальной таблице. (Виртуальные таблицы могут иметь индексы, но они должны быть встроены в виртуальную таблицу реализация. Индексы нельзя добавлять отдельно, используя CREATE INDEX заявления.)

  • Нельзя запускать команды ALTER TABLE... ADD COLUMN против виртуальной таблицы.

Итак, если вам нужен другой индекс в таблице, вам нужно использовать две таблицы.