【问题标题】:SQLite Virtual Table Match Escape characterSQLite 虚拟表匹配转义字符
【发布时间】:2010-01-08 12:29:50
【问题描述】:

我正在开发一个索引存储在 SQLite FTS3 虚拟表中的应用程序。我们正在实施全文匹配,这意味着我们通过以下查询发送:

select * from blah where term match '<insert term here>'

这一切都很好,直到我们要匹配的术语包含连字符,以防 SQLite 虚拟匹配语法将 bacon-and-eggs 解释为 bacon,而不是 and,而不是 egg。

有谁知道使 fts 表忽略连字符的转义字符?我尝试添加一个 ESCAPE '\' 子句并在每个连字符之前使用 \,但 match 语句拒绝该语法。

谢谢。

【问题讨论】:

    标签: sqlite full-text-search


    【解决方案1】:

    有很多 FTS 认为“特殊”的字符串需要转义。最简单的方法是在要搜索的字符串周围添加双引号。

    示例 1:说出您要搜索的字词是bacon-and-eggs

    select * from blah where term match '"bacon-and-eggs"'
    

    这也将整个字符串视为一个短语,因此以不同顺序使用相同单词的命中不会产生任何命中。为了解决这个问题,您可以单独引用每个单词。

    示例 2:说出您要搜索的字词是bacon and eggs

    select * from blah where term match '"bacon" "and" "eggs"'
    

    希望这对某人有所帮助!

    【讨论】:

      【解决方案2】:

      这个问题较早,涉及fts3,但我想我会添加一个更新来展示如何使用较新的fts5 来做到这一点。

      让我们先在命令行设置一个测试环境:

      $ sqlite3 ":memory:"
      

      然后创建一个可以处理破折号的 fts5 表:

      sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS blah USING fts5(term, tokenize="unicode61 tokenchars '-'");
      

      注意tokenize 值中双引号和单引号的微妙使用。

      设置完成后,让我们添加一些值来搜索:

      sqlite> INSERT INTO blah (term) VALUES ('bacon-and-eggs');
      sqlite> INSERT INTO blah (term) VALUES ('bacon');
      sqlite> INSERT INTO blah (term) VALUES ('eggs');
      

      然后让我们实际搜索它们:

      sqlite> SELECT * from blah WHERE term MATCH '"bacon-and-eggs"';
      bacon-and-eggs
      sqlite> SELECT * from blah WHERE term MATCH '"bacon"*';
      bacon-and-eggs
      bacon
      

      再次注意搜索词的双引号和单引号的微妙使用。

      【讨论】:

        【解决方案3】:

        FTS 忽略索引中的所有非字母数字字符。在将搜索词发送到 FTS 之前,您可以将其转换为

        bacon NEAR/0 AND NEAR/0 eggs
        

        搜索相邻的单词。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 2011-09-25
          • 1970-01-01
          相关资源
          最近更新 更多