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

时间:2013-04-18 10:19:47

标签: sqlite tokenize fts4

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

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

彼得

3 个答案:

答案 0 :(得分:6)

实际上你不需要编写自己的标记器。

'简单'标记生成器允许自定义分隔符,但它是一个未记录的功能。

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

CREATE VIRTUAL TABLE documents USING fts4(title, content, tokenize=simple '' '# ');

2012年here讨论了有关此功能的SQLite邮件列表。 SQLite中支持此功能的源代码是here

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

  

“可能原因是我们忘记了这个功能甚至存在。   它似乎存在于简单的标记器中,不变,因为   早在2006年就引入了FTS1。“

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

  

“但是在代码中已经有很长时间了,我们不敢改变   因为害怕打破历史悠久的计划。“

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

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

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

答案 1 :(得分:5)

您不需要编写自己的tokenizer:一些内置的tokenizer允许您在创建表时指定某些字符应该或不应该被视为字符。例如,unicode61标记生成器(请参阅FTS3 docs,您可能必须在构建时启用对它的支持)允许您传递tokencharsseparators参数(在{{ 3}})。

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

CREATE VIRTUAL TABLE whatever USING fts4(
    columns,

    tokenize=unicode61 "tokenchars=."
);

答案 2 :(得分:0)

标记器定义了标记,因此您确实需要编写自己的标记。

你可以搜索短语"2 3",它会找到带有任何分隔符的数字2和3。