Nir*_*rMH 2 sqlite full-text-search python-3.x fts5
我有一个表,其中包含使用字母数字、数字、点、下划线和方括号 [] 的 300K 字符串记录。
我使用 sqlite3 的 FTS5 扩展来实现对该表的快速搜索。这就是我创建 FTS 虚拟表的方式:
database = sqlite3.connect("mydb.db")
db_cursor = database.cursor()
db_cursor.execute("create virtual table field_names USING fts5 (full_path)")
Run Code Online (Sandbox Code Playgroud)
我在循环中使用以下代码添加 ~300K 记录:
database.execute("insert into field_names(full_path) values (?)", (field_path,))
Run Code Online (Sandbox Code Playgroud)
样本记录:
a.extbootrecord.field_db0
a.extbootrecord.field_db1
a.extbootrecord.field_db8
a.extbootrecord.field_db9
a.extbootrecord.field_db10
a.extbootrecord.field_db11
a.extbootrecord.field_db12
a.extbootrecord.field_db15
Run Code Online (Sandbox Code Playgroud)
使用以下查询:
db_cursor.execute("select full_path from field_names where field_names = '\"%s\"'" % search_phrase)
return_list = list()
entries = db_cursor.fetchmany(100)
while entries:
return_list.extend([entry[0] for entry in entries])
entries = db_cursor.fetchmany(100)
Run Code Online (Sandbox Code Playgroud)
与以下search_phrase产生以下结果:
ext : 没有什么extbootrecord : 所有记录extbootrecrd. : 所有记录extbootrecord.fie : 没有什么extbootrecord.field : 所有记录extbootrecord.field_db1:仅a.extbootrecord.field_db1记录,我希望返回 field_db1、field_db10、field_db11...似乎我缺少一些要使用的 FTS 配置.,_以及0-9作为令牌一部分的有效字符。
我尝试在创建语句中使用配置 FTS 标记生成器tokenize = \"unicode61 tokenchars '_.'\",但没有成功。
我缺少什么?
这是一个完整的示例,可以帮助您理解tokenchars其工作原理,因为我认为语法相当微妙且容易出错。
让我们首先在 shell 中创建一个测试环境:
$ sqlite3 ":memory:"
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个允许句点的fts5 表:
sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS foo USING fts5(name UNINDEXED, keywords, tokenize="unicode61 tokenchars '.'");
Run Code Online (Sandbox Code Playgroud)
请注意该值的设置方式tokenize,将值用双引号括起来,将tokenchars要添加的值用单引号括起来(我们只是在此处添加句点,但您可以添加任意数量的字符)。
表格准备就绪后,我们就可以插入一些值了:
sqlite> INSERT INTO foo (name, keywords) VALUES ('bar', '1.0');
sqlite> INSERT INTO foo (name, keywords) VALUES ('che', '1.5');
sqlite> INSERT INTO foo (name, keywords) VALUES ('baz', '2.5');
Run Code Online (Sandbox Code Playgroud)
并搜索这些值:
sqlite> SELECT name from foo WHERE keywords MATCH '"1."*';
bar
che
sqlite> SELECT name from foo WHERE keywords MATCH '"1.5"*';
che
sqlite> SELECT name from foo WHERE keywords MATCH '"2"*';
baz
Run Code Online (Sandbox Code Playgroud)
请注意,如果我们的搜索字符串中有句点,我们必须如何搜索值,我们必须将搜索字符串用双引号括起来(如果我们想要进行前缀搜索,则在这些双引号之外添加星号),然后像往常一样将整个字符串用单引号括起来。
如果我们不使用双引号:
sqlite> SELECT name from foo WHERE keywords MATCH '1.*';
Error: fts5: syntax error near "."
Run Code Online (Sandbox Code Playgroud)
或者我们错误地使用了双引号:
sqlite> SELECT count(*) from foo WHERE keywords MATCH '1"."*';
0
Run Code Online (Sandbox Code Playgroud)
然后我们会得到模糊的、无用的错误和意想不到的结果,这将导致我们在互联网上搜索,试图找出我们做错了什么,并偶然发现这个问题:)
| 归档时间: |
|
| 查看次数: |
2884 次 |
| 最近记录: |