On 07/31/2018 12:25 PM, paul tracy wrote:
Forgive me if this is the wrong way to do this but I'm a newbie.
I am using version 3.24.0 with FTS5
Is there a way to perform a full text search that returns every row except
records matching a specified query string?
The following does not work because of a syntax error as the syntax requires a
query string before the NOT operator: … MATCH 'NOT blah';The following also
does not work because the * operand cannot be used by itself: … MATCH '* NOT
blah';
In desperation I tried the following which returned data but a seemingly random set of
data: MATCH NOT 'blah';
I think that's interpreted as "MATCH (NOT 'blah')", which is equivalent
to "MATCH 1". So probably returned all the rows featuring a "1" token.
I wound up using something like this …
SELECT * FROM mytable WHERE id NOT IN (SELECT id from FullTextIndex WHERE
FullTextIndex MATCH 'blah');
I think this is much slower on large databases than a full FTS-based query but
maybe I'm wrong and this is as fast as it gets.
I think that is the best you can do. The FTS index does not have a list
of all document ids to exclude the list of ids that match "blah" from.
You could force it to store such a list, then contrive of a query that
used it. e.g. add "commontoken" to the start of all entries and then
query for:
"commontoken NOT blah"
Or you could create a custom tokenizer that just pretended each entry
had a common token at the start of it.
https://www.sqlite.org/fts5.html#custom_tokenizers
But otherwise, the underlying data structure just doesn't support that
type of query.
Dan.
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users