我正在使用 sqlite 进行全文搜索,以下是我正在使用的一些选择查询示例。
前:
SELECT * FROM table WHERE table MATCH'column: father's 'ORDER BY rank;
SELECT * FROM table WHERE table MATCH'column: example:'ORDER BY rank;
由于我在搜索文本中使用' : & 字符,因此这些查询会给我错误。我在trycuation标记之前尝试过使用转义字符(\ - 反斜杠)。
使用MATCH运算符搜索fts5中的标点符号(,。/“' - &等)的任何解决方案?
这些字符与匹配运算符
一起使用 _,€,£,¥由于
答案 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
还注意到s
与father's
的匹配方式吗?这是因为当您通过令牌生成器运行father's
时,它将根据the following rules by default被令牌化:
FTS5裸字是一个或多个连续字符的字符串 都是:
- 非ASCII范围字符(即,大于127的unicode码点),或
- 52个大写和小写ASCII字符之一,或
- 10个十进制数字ASCII字符之一,或
- 下划线字符(unicode代码点96)。
- 替代字符(unicode代码点26)。
因此,father's
将被标记为father
和s
,这可能是您想要的,也可能不是您想要的,但是出于这个答案的考虑,我将假定不是你想要什么。
那么您如何告诉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
太好了!
希望这有助于您按预期的方式设置表格。