2

I want to be able to search for numbers like 2.3 using FTS4 in SQLite, but the . is being treated as a token boundary. Short of writing a full bespoke tokenizer is there any other way of excluding the . from the list of token boundary characters?

Being able to search for decimal numbers seems like a common use case, but I can't find anything relevant on SO / Google. My best solution at present is to replace all . chars in the text with a known (long) string of letters and substitute accordingly on each search...

Peter

4

3 回答 3

9

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

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

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

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

2012 年的 SQLite 邮件列表中有关于此功能的讨论。支持此功能的 SQLite 源代码在这里

从邮件列表中引用关于其缺乏文档的内容:

“可能的原因是我们忘记了这个功能甚至存在。自从 2006 年最初引入 FTS1 以来,它似乎已经存在于简单的标记器中,没有改变。”

关于使用该功能是否安全的报价:

“但它在代码中已经存在很长时间了,我们不敢更改它,因为害怕破坏长期建立的程序。”

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

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

更新:我要补充的一件事是,我们发现如果将诸如 '*' 或 '-' 之类的字符配置为这样的分隔符,那么它们也会从 FTS MATCH 子句中的查询中删除。因此,虽然这适用于“。” 等,它不能用于在 FTS MATCH 中也是特殊字符的字符。

于 2014-09-16T15:30:42.517 回答
5

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

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

CREATE VIRTUAL TABLE whatever USING fts4(
    columns,

    tokenize=unicode61 "tokenchars=."
);
于 2013-08-23T19:21:35.243 回答
0

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

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

于 2013-04-18T16:44:37.473 回答