SQLite:一个单词中的FTS匹配可以忽略哪个字符

Posted

技术标签:

【中文标题】SQLite:一个单词中的FTS匹配可以忽略哪个字符【英文标题】:SQLite: which character can be ignored with FTS match in one word 【发布时间】:2013-03-05 16:35:30 【问题描述】:

我需要找到任何特殊字符。如果我把它放在一个单词的中间,SQLite FTS 匹配可以忽略它,就好像它不存在一样,例如:

Text Body: book's

如果我的匹配字符串是“books”,我需要得到“book's”的结果.. 使用搬运工或简单的分词器没问题。

我为此尝试了许多字符,例如:book!s、book?s、book|s、book,s、book:s……,但是当通过匹配搜索“books”时,没有返回这些结果。

我不明白,为什么?

我正在使用:无内容 FTS4 表和外部内容 FTS4 表,我的文本正文中每个单词都有很多字符,应该在搜索时更改为忽略它..

我无法更改匹配查询,因为我不知道单词中的特殊字符在哪里。另外,我需要让原始字长等于 FTS 索引字的长度才能使用匹配信息或 sn-p();因此,我无法从文本正文中删除这些字符。

【问题讨论】:

【参考方案1】:

默认分词器不会忽略标点符号,而是将它们视为单词分隔符。

因此,文本正文或匹配字符串 book's 将以两个词结尾,books。 这些永远不会匹配像books 这样的单一作品。

要忽略 ' 这样的字符,您必须 install your own custom tokenizer。

【讨论】:

我正在使用 .net 中的“System.Data.SQLite”,所以我可以从 C# 编写自定义标记器吗?我对C或C++一无所知,那该怎么办?另一种方法可以将 MATCH 函数覆盖为 C# 中的 SQLite 函数,如 REGEXP 函数? MATCH 已经是自定义函数,由 FTS 虚拟表实现。你必须学习 C,或者聘请有能力的人。 谢谢.. 另外两件事,1:有什么方法可以将正则表达式与 FTS 或 MATCH 一起使用? 2:这是破解 SQLite 标记器的正确方法吗?如果可以,如何解决我的问题?见:sqlite.1065341.n5.nabble.com/… 没有。否(您想忽略,而不是分隔)。 (而且问题不属于 cmets。)

以上是关于SQLite:一个单词中的FTS匹配可以忽略哪个字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 中查询一个 fts 表以查找一个匹配的列和另一个不匹配特定查询的列?

SQLite3 FTS3/FTS4 匹配信息示例

带有 FTS4 表的 sqlite3:查询返回错误的行

安卓 SQLITE FTS 版本

PhoneGap、SQLite 和全文搜索

FTS4 SQLITE 中的外部内容