Sqlite FTS5标点符号在选择查询

时间:2017-05-15 13:41:15

标签: ios fts5

我正在使用 sqlite 进行全文搜索,以下是我正在使用的一些选择查询示例。

前:

  1. SELECT * FROM table WHERE table MATCH'column: father's 'ORDER BY rank;

  2. SELECT * FROM table WHERE table MATCH'column: example:'ORDER BY rank;

  3. SELECT * FROM table WHERE table MATCH'column: month& 'ORDER BY rank;
  4. 由于我在搜索文本中使用' & 字符,因此这些查询会给我错误。我在trycuation标记之前尝试过使用转义字符(\ - 反斜杠)。

    使用MATCH运算符搜索fts5中的标点符号(,。/“' - &等)的任何解决方案?

    这些字符与匹配运算符

    一起使用 _,€,£,¥

    由于

3 个答案:

答案 0 :(得分:0)

这似乎与this question重复。尝试那里的最佳答案,声明您应将搜索字符串括在单引号和双引号中。

答案 1 :(得分:0)

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
              holder.getAdapterPosition();
    }

答案 2 :(得分:0)

我想遍历完整的示例,因为我发现使用fts5可以轻松获得微妙的意外结果。

首先,虽然包装搜索字符串可能会为您提供正确的答案,但这可能并非您真正想要的,下面是一个示例来说明:

$ sqlite3 ":memory:"
sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS bad USING fts5(term, tokenize="unicode61");
sqlite>
sqlite> INSERT INTO bad (term) VALUES ('father''s');
sqlite>
sqlite> SELECT * from bad WHERE term MATCH 'father';
father's
sqlite> SELECT * from bad WHERE term MATCH '"father''s"';
father's
sqlite> SELECT * from bad WHERE term MATCH 's';
father's

还注意到sfather's的匹配方式吗?这是因为当您通过令牌生成器运行father's时,它将根据the following rules by default被令牌化:

  

FTS5裸字是一个或多个连续字符的字符串   都是:

     
      
  • 非ASCII范围字符(即,大于127的unicode码点),或
  •   
  • 52个大写和小写ASCII字符之一,或
  •   
  • 10个十进制数字ASCII字符之一,或
  •   
  • 下划线字符(unicode代码点96)。
  •   
  • 替代字符(unicode代码点26)。
  •   

因此,father's将被标记为fathers,这可能是您想要的,也可能不是您想要的,但是出于这个答案的考虑,我将假定不是你想要什么。

那么您如何告诉tokenizer保持father's在一起呢?通过使用tokenchars参数的tokenize选项:

  

令牌令牌此选项用于指定应视为令牌字符的其他unicode字符,即使它们是根据Unicode 6.1的空格或标点符号也是如此。将此选项设置为字符串中的所有字符均视为令牌字符。

让我们看看另一个示例,这次是使用tokenchars的示例:

$ sqlite3 ":memory:"
sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS good USING fts5(term, tokenize="unicode61  tokenchars '''&:'");
sqlite>
sqlite> INSERT INTO good (term) VALUES ('father''s');
sqlite> INSERT INTO good (term) VALUES ('month&');
sqlite> INSERT INTO good (term) VALUES ('example:');
sqlite>
sqlite> SELECT count(*) from good WHERE term MATCH 'father';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"father''s"';
1
sqlite> SELECT count(*) from good WHERE term MATCH 'example';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"example:"';
1
sqlite> SELECT count(*) from good WHERE term MATCH 'month';
0
sqlite> SELECT count(*) from good WHERE term MATCH '"month&"';
1

这些结果似乎更令人期待。但是,第一个示例的随机s结果如何呢?

sqlite> SELECT count(*) from good WHERE term MATCH 's';
0

太好了!

希望这有助于您按预期的方式设置表格。