gpt4 book ai didi

ios - Sqlite FTS5 标点符号在选择查询中不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:20 25 4
gpt4 key购买 nike

我正在使用 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;

因为我在搜索文本中使用了' : & 字符,所以这些查询会给我错误。我也尝试在标点符号前使用转义字符(\-反斜杠)。

有没有使用 MATCH 运算符在 fts5 中搜索标点符号(、./"' - & 等)的解决方案?

这些字符与匹配运算符一起使用_、€、£、¥

谢谢

最佳答案

我想看一个完整的例子,因为我发现使用 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 如何与 fathers 匹配?这是因为当您通过分词器运行 father's 时,它将根据 the following rules by default 进行分词。 :

An FTS5 bareword is a string of one or more consecutive characters that are all either:

  • Non-ASCII range characters (i.e. unicode codepoints greater than 127), or
  • One of the 52 upper and lower case ASCII characters, or
  • One of the 10 decimal digit ASCII characters, or
  • The underscore character (unicode codepoint 96).
  • The substitute character (unicode codepoint 26).

因此 father's 将被标记化为 fathers,这可能是也可能不是您想要的,但为了这个answer 我假设这不是您想要的。

那你怎么告诉 tokenizer父亲的放在一起?通过使用 tokenize 参数的 tokenchars 选项:

tokenchars This option is used to specify additional unicode characters that should be considered token characters, even if they are white-space or punctuation characters according to Unicode 6.1. All characters in the string that this option is set to are considered token characters.

让我们看另一个例子,这次是使用 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

太棒了!

希望这可以帮助您按照预期的方式设置表格。

关于ios - Sqlite FTS5 标点符号在选择查询中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com