#sqlite #fts4
#sqlite #fts4
Вопрос:
Я хочу создать виртуальную таблицу SQLite с содержимым реального.
У меня есть небольшой пример, который демонстрирует мою проблему. Я уже перечитал официальный учебник, но не могу найти ничего неправильного в этом коде. Некоторые пользователи используют rebuild
опцию, но у меня она не работает.
CREATE TABLE if NOT EXISTS posts (a INTEGER PRIMARY KEY);
INSERT OR IGNORE INTO posts (a) VALUES(510000);
INSERT OR IGNORE INTO posts (a) VALUES(510001);
INSERT OR IGNORE INTO posts (a) VALUES(510300);
CREATE VIRTUAL TABLE IF NOT EXISTS posts_fts using fts5(content=posts, content_rowid=a, a);
SELECT * FROM posts_fts where posts_fts MATCH '10' ORDER BY a ASC;
Если я запускаю это, я получаю:
0 rows returned in 2ms from: SELECT * FROM posts_fts where posts_fts match '10' ORDER BY a ASC;
У кого-нибудь есть идея, что я делаю неправильно?
Ответ №1:
«10» не является токеном в таблице FTS.
Из документа:
4.3.1. Токенизатор Unicode61
Unicode tokenizer классифицирует все символы unicode как символы «разделителя» или «токена». По умолчанию все символы пробела и пунктуации, определенные в Unicode 6.1, считаются разделителями, а все остальные символы — символами токена. Более конкретно, все символы юникода, назначенные общей категории, начинающейся с «L» или «N» (в частности, буквы и цифры) или категории «Co» («другое, частное использование»), считаются токенами. Все остальные символы являются разделителями.
Каждый непрерывный запуск одного или нескольких символов токена считается токеном. Токенизатор не чувствителен к регистру в соответствии с правилами, определенными Unicode 6.1.
Также из документа:
3.2. Фразы FTS5
Запросы FTS состоят из фраз. Фраза — это упорядоченный список из одного или нескольких токенов.
Вы можете попробовать «запрос префикса», т.Е. MATCH "5*"
Увидеть, Что вы получаете результаты.
Комментарии:
1. Спасибо @DinoCoderSaurus! Я попытался сопоставить с ‘prefix’, но это не сработало. Вы пытались запустить этот код с другими
match
выражениями? Он создает виртуальную таблицу с содержимым реальной, но вы ничего не можете сопоставить. Я также работал с другими встроенными токенизаторами с тем же результатом.2. Выполните проверку целостности
insert into posts_fts(posts_fts) VALUES ('integrity-check');
, если она возвращает ошибки, перестройтеinsert into posts_fts(posts_fts) VALUES ('rebuild');
. Я запустил ваш скрипт в базе данных в памяти из командной строки SQLite (версия 3.17.0).validity-check
далError: database disk image is malformed
. После перестроения запрос префикса сработал.3. Теперь он работает после обновления до версии SQLite 3.27.2 и работает после
rebuild
. До сих пор остается загадкой, почему возникает эта проблема.