3

我正在尝试订购快速文本搜索,以便完全匹配是第一个,部分匹配是最后一个。

我创建了一个在 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'

这是怎么回事?

4

2 回答 2

6

Android FTS 使用标准查询语法,未增强。

因此,它不会将“NOT”或“AND”识别为运算符。它实际上是在尝试将它们与您的 db 列的文本相匹配。这就是为什么在 Android 上,您唯一的匹配项来自实际文本中带有“not”的条目。

您必须使用“-”表示 NOT,使用空格表示 AND。因此,您的语法应如下所示:

WHERE Glossfts.value MATCH 'dog* -dog'

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

于 2013-06-26T08:13:47.580 回答
2

显然,该 Android 设备上的 SQLite 已使用不同的 FTS 查询语法进行编译。

检查PRAGMA compile_options;for的输出ENABLE_FTS3_PARENTHESIS,并相应地调整您的查询。

于 2013-06-16T12:41:50.653 回答