怎么停下来 在SQLite FTS4中被视为分隔符

Pet*_*ter 2 sqlite tokenize fts4

我希望能够在SQLite中使用FTS4搜索2.3这样的数字,但是.被视为令牌边界.如果没有编写完整的定制标记器,还有其他方法可以排除.从令牌边界字符列表?

能够搜索十进制数字似乎是一个常见的用例,但我在SO/Google上找不到任何相关内容.我目前最好的解决方案是替换所有.文本中的字符带有一个已知的(长)字母串,并相应地替换每个搜索...

彼得

npg*_*all 7

实际上你不需要编写自己的tokenizer.

'简单'标记化器允许定制分隔符,但它是一个未记录的功能.

按如下方式创建您的FTS表,SQLite将仅对''(空格)和'#'(哈希)字符进行标记:

CREATE VIRTUAL TABLE documents USING fts4(title, content, tokenize=simple '' '# ');
Run Code Online (Sandbox Code Playgroud)

有大约在2012年此功能的SQLite的邮件列表上的讨论在这里.SQLite中支持此功能的源代码就在这里.

从邮件列表中引用它缺少文档:

"可能的原因是我们忘记了这个功能甚至存在.它似乎存在于简单的标记器中,不变,自从2006年FTS1的最初引入以来."

引用关于使用该功能是否安全:

"但是,由于担心打破历史悠久的计划,我们不得不改变它."

...但是也有人提到该功能不太可能经过彻底测试.

我刚刚通过电子邮件发送了SQLite用户邮件列表,询问是否可以记录此功能.

更新:我要添加的一件事是,我们发现如果像'*'或' - '这样的字符被配置为这样的分隔符,那么它们也会在查询中被剥离出FTS MATCH子句.所以虽然这适用于"." 它不能用于FTS MATCH中也是特殊字符的字符.


cha*_*cus 5

您不需要编写自己的标记生成器:一些内置的标记生成器允许您在创建表时指定某些字符应该或不应该被视为单词字符.例如,unicode61 tokenizer(参见FTS3文档,您可能必须在构建时启用它的支持)允许您传递tokencharsseparators参数(在源代码中查找).

在你的情况下,我相信你可以使用这样的东西:

CREATE VIRTUAL TABLE whatever USING fts4(
    columns,

    tokenize=unicode61 "tokenchars=."
);
Run Code Online (Sandbox Code Playgroud)