gpt4 book ai didi

android - FTS3 和 FTS4 匹配 :, - 和 _ 字符

转载 作者:搜寻专家 更新时间:2023-11-01 09:01:01 26 4
gpt4 key购买 nike

我在启用了 FTS 的 SQLite 数据库上看到了一些奇怪的行为。我有一个名为 fingerprints 的表,其中包含一个名为 scan 的列。扫描条目是长字符串,如下所示:

00:13:10:d5:69:88_-58;0c:85:25:68:b4:30_-75;0c:85:25:68:b4:34_-76;0c:85:25:68:b4:33_-76;0c:85:25:68:b4:31_-76;0c:85:25:68:b4:35_-76;00:23:eb:ad:f6:00_-87; etc

它代表MAC地址和信号强度。现在我想在表上进行字符串匹配并尝试匹配例如 MAC 地址:

SELECT _id FROM fingerprints WHERE scan MATCH "00:13:10:d5:69:88";

由于某种原因,这会返回很多没有指定字符串的行。我将尝试匹配的第二件事是

SELECT _id FROM fingerprints WHERE scan MATCH "00:13:10:d5:69:88_-58";

这会返回与之前相同的行,但这是完全错误的。

SQLite 是否以任何特殊方式处理 : _ - 字符?

谢谢

最佳答案

您看到的是 FTS 的效果 tokenizing your data .

全文搜索不适用于未处理的长字符串,它将您的数据(和您的搜索词)拆分为单词并分别为它们编制索引。默认分词器使用所有字母数字字符和代码点 >128 的所有字符作为单词,并使用其余字符(例如,如您所见 : _ - )作为单词边界。

换句话说,您搜索 00:13:10:d5:69:88将搜索包含单词 00 的行和 1310d56988任何顺序

您可以验证此行为;

sqlite> CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple);
sqlite> INSERT INTO simple VALUES('00:13:10:d5:69:88');
sqlite> SELECT * FROM simple WHERE simple MATCH '69:10';

-> 00:13:10:d5:69:88

编辑:显然 SQLite 比我最初认为的更聪明,您可以使用 phrase queries (scroll down about a page from the link destination)寻找单词序列,这将解决您的问题。短语查询是通过用双引号 (") 括起空格(或其他单词分隔符)分隔的术语序列来指定的。

sqlite> SELECT * FROM simple WHERE simple MATCH '"69:10"';

-> No match

sqlite> SELECT * FROM simple WHERE simple MATCH '"69 88"';

-> 00:13:10:d5:69:88

sqlite> SELECT * FROM simple WHERE simple MATCH '"69:88"';

-> 00:13:10:d5:69:88

关于android - FTS3 和 FTS4 匹配 :, - 和 _ 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14949599/

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