Унарный НЕ в запросе соответствия SQLite FTS5

#sqlite #match #full-text-search #fts5

Вопрос:

В документах SQLite FTS5 говорится, что поддерживаются такие поисковые запросы, как SELECT ... WHERE MATCH '<query1> NOT <query2>' , но, похоже, унарный NOT оператор не поддерживается.

Например, если я хочу найти все , что не соответствует <query> , я не могу использовать MATCH 'NOT <query>' . Мне пришлось бы использовать NOT MATCH '<query>' , что совершенно другое (модуль FTS5 никогда не видит NOT оператора, так как он находится за пределами кавычек). Поисковым запросом является только текст в кавычках.

Мне нужно найти способ использовать унарный NOT оператор внутри поискового запроса. Я не могу использовать его снаружи, потому что я могу контролировать только текст поискового запроса, а не остальную часть инструкции SQL.

Возможный подход, о котором я думал, состоял бы в том, чтобы найти поисковый запрос, который соответствует чему-либо, и выполнить MATCH '<match_anything> NOT <query>' его . Однако я не нашел способа сопоставить все в поисковом запросе.

Можете ли вы придумать способ, чтобы поведение унарного NOT оператора было включено в поисковый запрос?

Ответ №1:

Попробуй это ..

 SELECT * FROM docs
WHERE ROWID NOT IN ( 
  SELECT ROWID FROM docs WHERE content MATCH '<query>'
)
 

Комментарии:

1. Хорошая идея! Однако, как я уже говорил в своем первоначальном вопросе, мне нужно найти способ использовать унарный NOT оператор внутри поискового запроса . Здесь это снаружи, так что в моем случае это бесполезно… Однако в общем случае это действительно работает как обходной путь!