SQLITE Полный текст: Как найти все строки, содержащие слова с заданным размером c? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть таблица полнотекстового поиска sqlite3, определенная следующим образом:

CREATE VIRTUAL TABLE dataset USING fts3(content TEXT);

Пример содержимого:

content
=======
1 I like potatoes
2 Do you want a bottle?
3 I have loose my computer games

Если мой поиск:

  1. найти все строки, содержащие слова с 8 букв . Результат должен быть (1, 3) , потому что у нас есть картофель и компьютер
  2. найти все строки, содержащие слова с 5 букв . Результат должен быть (3) , потому что у нас есть Свободный
  3. Найти все строки, содержащие слова с 4 буквы . Результат должен быть (1, 2 и 3) , потому что у нас есть как , хочу и есть

1 Ответ

1 голос
/ 14 февраля 2020

FTS5 решение. При этом используется механизм виртуальной таблицы fts5vocab , который предоставляет публикуемый c интерфейс для внутренних таблиц индекса, используемых поисковой системой (FTS3 / 4 имеет аналогичную виртуальную таблицу fts4aux , но он не предоставляет тот же набор функций и не может использоваться для определения точных строк, в которых появляется термин).

sqlite> CREATE VIRTUAL TABLE dataset USING fts5(content);
sqlite> CREATE VIRTUAL TABLE dataset_vocab USING fts5vocab(dataset, instance);
sqlite> INSERT INTO dataset(rowid, content) VALUES (1, 'I like potatoes'), (2, 'Do you want a bottle?'), (3, 'I have loose my computer games');
sqlite> SELECT DISTINCT doc FROM dataset_vocab WHERE length(term) = 8 ORDER BY doc;
doc
----------
1
3
sqlite> SELECT DISTINCT doc FROM dataset_vocab WHERE length(term) = 5 ORDER BY doc;
doc
----------
3
sqlite> SELECT DISTINCT doc FROM dataset_vocab WHERE length(term) = 4 ORDER BY doc;
doc
----------
1
2
3

Без FTS5 вам придется разбивать каждый столбец на отдельные слова самостоятельно и вернуть только те, соответствующей длины. При этом токенизатор FTS5 сделает за вас самое сложное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...