SQLite Virtual Table Match Escape символ - PullRequest
0 голосов
/ 08 января 2010

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

select * from blah where term match '<insert term here>'

Это все хорошо, пока термин, который мы хотим сопоставить, не содержит дефис в случае, если синтаксис виртуального совпадения SQLite интерпретирует бекон и яйца как бекон, а не и не яйца.

Кто-нибудь знает экранирующий символ, чтобы таблица fts игнорировала дефис? Я попытался добавить условие ESCAPE '\' и использовать \ перед каждым дефисом, но оператор match отклоняет этот синтаксис.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 мая 2017

Есть много строк, которые FTS считает «особенными» и которые нужно экранировать. Самый простой способ сделать это - добавить двойные кавычки вокруг строки, которую вы хотите найти.

Пример 1 : Скажите, что термин, который вы хотите найти, равен bacon-and-eggs.

select * from blah where term match '"bacon-and-eggs"'

Это также обрабатывает всю строку как фразу, поэтому попадания с одинаковыми словами в другом порядке не генерируют попадания. Чтобы обойти это, вы можете процитировать каждое слово в отдельности.

Пример 2 : Скажите, что термин, который вы хотите найти, равен bacon and eggs.

select * from blah where term match '"bacon" "and" "eggs"'

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 04 октября 2018

Этот вопрос старше и включает fts3 , но я подумал, что добавлю обновление, чтобы показать, как вы можете сделать это, используя более новую fts5 .

Давайте начнем с настройки тестовой среды в командной строке:

$ sqlite3 ":memory:"

Затем создаем таблицу fts5, которая может обрабатывать тире:

sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS blah USING fts5(term, tokenize="unicode61 tokenchars '-'");

Обратите внимание на тонкое использование двойных и одинарных кавычек в значении tokenize.

С установкой вне пути, давайте добавим некоторые значения для поиска:

sqlite> INSERT INTO blah (term) VALUES ('bacon-and-eggs');
sqlite> INSERT INTO blah (term) VALUES ('bacon');
sqlite> INSERT INTO blah (term) VALUES ('eggs');

Тогда давайте действительно поищем их:

sqlite> SELECT * from blah WHERE term MATCH '"bacon-and-eggs"';
bacon-and-eggs
sqlite> SELECT * from blah WHERE term MATCH '"bacon"*';
bacon-and-eggs
bacon

Еще раз обратите внимание на тонкое использование двойных и одинарных кавычек для поискового запроса.

0 голосов
/ 12 января 2010

FTS игнорирует все не алфавитно-цифровые символы в индексе.Перед отправкой поискового термина в FTS вы можете преобразовать его в

bacon NEAR/0 AND NEAR/0 eggs

для поиска соседних слов.

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