Android Sqlite FTS НЕ работает

Я пытаюсь заказать быстрый текстовый поиск, чтобы точные совпадения были первыми, а частичные совпадения - последними.

Я создал запрос, который работает в SQLiteStudio:

SELECT value, 1 AS _order FROM glossfts
WHERE glossfts.value MATCH 'dog'
UNION
SELECT value, 2 AS _order FROM glossfts
WHERE glossfts.value MATCH 'dog* NOT dog'
ORDER BY _order

Так что результат будет

Beware of dog                                     1
Disliked by everybody, not even a dog will eat    1
Bad dog                                           1
Creed, dogma                                      2
Dogs                                              2
Dogwood                                           2

И это прекрасно работает, но когда я использую тот же запрос в Android, я получаю только

Beware of dog                                     1
Disliked by everybody, not even a dog will eat    1
Bad dog                                           1
Disliked by everybody, not even a dog will eat    2

назад, как кажется, интерпретирует:

MATCH 'dog* NOT dog'

как

MATCH 'dog* not dog'

В чем дело?

2 ответа

Решение

Android FTS использует стандартный синтаксис запроса, не улучшенный.

Таким образом, он не распознает "НЕ" или "И" в качестве операторов. Это на самом деле пытается сопоставить их с текстом ваших столбцов БД. Вот почему на Android ваше единственное совпадение было получено из записи с "not" в реальном тексте.

Вы должны использовать "-" для НЕ и пробел для AND. Таким образом, ваш синтаксис должен выглядеть так:

ГДЕ глянец.значение МАТЧ 'собака * -дог'

http://www.sqlite.org/fts3.html

По-видимому, SQLite на этом устройстве Android был скомпилирован с другим синтаксисом запросов FTS.

Проверьте вывод PRAGMA compile_options; за ENABLE_FTS3_PARENTHESISи скорректируйте свои запросы соответственно.

Другие вопросы по тегам