sqlitefull-text-searchfts5

Lossless SQLite FTS5 search of a substring


Using a FTS5 virtual table returns nothing for postfix searches.

It only can search for the entire word tokens, or for the prefixes of the word tokens if I append * to the search.

For example, it does not find qwerty.png row, if I search for werty.

CREATE TABLE IF NOT EXISTS files (name TEXT, id INTEGER);
INSERT INTO files (name, id) VALUES ('qwerty.png', 1),  ('asdfgh.png', 2);
CREATE VIRTUAL TABLE IF NOT EXISTS names USING FTS5(name);
INSERT INTO names (name) SELECT name FROM files;
SELECT *
FROM names
WHERE name MATCH 'werty';

It only works for prefix searches (qwerty, qwer*, qwe*, ...).

I can't use * at the start of the search (*werty), since it produces an error.


Is possibly to make the indexed text search working as if I would use

SELECT *
FROM names
WHERE name like '%wert%';

?

I just want to have the fast search for a substring without the full table scan.


Solution

  • Perhaps try the experimental trigram tokenizer

    When using the trigram tokenizer, a query or phrase token may match any sequence of characters within a row, not just a complete token.