我希望能够在SQLite中使用FTS4搜索2.3之类的数字,但是。被视为令牌边界。如果没有编写完整的定制标记器,还有其他方法可以排除。从令牌边界字符列表?
能够搜索十进制数字似乎是一个常见的用例,但我在SO / Google上找不到任何相关内容。我目前最好的解决方案是替换所有。文本中的字符带有一个已知的(长)字母串,并相应地替换每个搜索...
彼得
答案 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,您可能必须在构建时启用对它的支持)允许您传递tokenchars
和separators
参数(在{{ 3}})。
在你的情况下,我相信你可以使用这样的东西:
CREATE VIRTUAL TABLE whatever USING fts4(
columns,
tokenize=unicode61 "tokenchars=."
);
答案 2 :(得分:0)
标记器定义了标记,因此您确实需要编写自己的标记。
你可以搜索短语"2 3"
,它会找到带有任何分隔符的数字2和3。