Ios Sqlite FTS5标点符号在select查询中不起作用
我正在使用sqlite进行全文搜索,下面是我正在使用的一些select查询示例 例:Ios Sqlite FTS5标点符号在select查询中不起作用,ios,fts5,Ios,Fts5,我正在使用sqlite进行全文搜索,下面是我正在使用的一些select查询示例 例: 从表匹配的表中选择*列:父亲的“按等级排序” 从表匹配的表中选择*列:示例:“按等级排序” 从表匹配的表中选择*列:月&“按等级排序” 由于我在搜索文本中使用了,:&字符,这些查询给了我错误。我也尝试过在puncuation标记之前使用转义字符(\-反斜杠) 使用匹配运算符搜索fts5中的点状标记(、./“'-&等)的任何解决方案? 这些字符与匹配运算符一起工作 谢谢。这似乎是的重复。请尝试上面的答案,该答案说
谢谢。这似乎是的重复。请尝试上面的答案,该答案说明您应该将搜索字符串括在单引号和双引号内。我想浏览一个完整的示例,因为我发现使用它很容易获得微妙和意外的结果
# fathers'
SELECT * FROM table WHERE table MATCH 'column:"father''s"';
# example:
SELECT * FROM table WHERE table MATCH 'column:"example:"';
# month&
SELECT * FROM table WHERE table MATCH 'column:"month&"';
首先,虽然包装搜索字符串可能会为您提供正确的答案,但它可能不是您真正想要的,下面是一个示例来说明:
$ sqlite3 ":memory:"
sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS bad USING fts5(term, tokenize="unicode61");
sqlite>
sqlite> INSERT INTO bad (term) VALUES ('father''s');
sqlite>
sqlite> SELECT * from bad WHERE term MATCH 'father';
father's
sqlite> SELECT * from bad WHERE term MATCH '"father''s"';
father's
sqlite> SELECT * from bad WHERE term MATCH 's';
father's
注意s
如何与父亲的匹配?这是因为当您通过标记器运行father's
时,它将根据以下内容进行标记:
FTS5裸字是由一个或多个连续字符组成的字符串
这些都是:
- 非ASCII范围字符(即大于127的unicode代码点),或
- 52个大写和小写ASCII字符之一,或
- 10位十进制ASCII字符之一,或
- 下划线字符(unicode代码点96)
- 替换字符(unicode代码点26)
因此,父亲的
将被标记为父亲
和s
,这可能是您想要的,也可能不是您想要的,但是为了这个答案,我假设这不是您想要的
那么,您将如何告知将父亲的
放在一起呢?通过使用tokenize
参数的tokenchars
选项:
标记字符此选项用于指定应被视为标记字符的其他unicode字符,即使它们是符合unicode 6.1的空白字符或标点字符。此选项设置为的字符串中的所有字符都被视为标记字符
让我们看另一个例子,这次是一个使用tokenchars
:
$ sqlite3 ":memory:"
sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS good USING fts5(term, tokenize="unicode61 tokenchars '''&:'");
sqlite>
sqlite> INSERT INTO good (term) VALUES ('father''s');
sqlite> INSERT INTO good (term) VALUES ('month&');
sqlite> INSERT INTO good (term) VALUES ('example:');
sqlite>
sqlite> SELECT count(*) from good WHERE term MATCH 'father';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"father''s"';
1
sqlite> SELECT count(*) from good WHERE term MATCH 'example';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"example:"';
1
sqlite> SELECT count(*) from good WHERE term MATCH 'month';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"month&"';
1
这些结果似乎更符合预期。但是第一个例子的随机s
结果呢
sqlite> SELECT count(*) from good WHERE term MATCH 's';
0
太好了
希望这能帮助您按照预期的方式设置表格