Ios Sqlite FTS5标点符号在select查询中不起作用

Ios Sqlite FTS5标点符号在select查询中不起作用,ios,fts5,Ios,Fts5,我正在使用sqlite进行全文搜索,下面是我正在使用的一些select查询示例 例: 从表匹配的表中选择*列:父亲的“按等级排序” 从表匹配的表中选择*列:示例:“按等级排序” 从表匹配的表中选择*列:月&“按等级排序” 由于我在搜索文本中使用了,:&字符,这些查询给了我错误。我也尝试过在puncuation标记之前使用转义字符(\-反斜杠) 使用匹配运算符搜索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
    
    太好了

    希望这能帮助您按照预期的方式设置表格