Как создать виртуальную таблицу FTS с внешней таблицей содержимого sqlite?

#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 . До сих пор остается загадкой, почему возникает эта проблема.