赞
踩
FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)
我有一个外部数据库,我使用sqlite 3版本3.13.0与2表这样。
我创建了一个虚拟表:
CREATE VIRTUAL TABLE tb_bank_fts USING fts4 (content="tb_bank",address, typename)
虚拟表创建成功,我可以使用选择。
但是我不能使用fts4表的“匹配”查询,总是返回null而没有错误。
半个月前,我可以用“匹配”查询fts4表,但现在我不能这样做。我不知道为什么。 我尝试在Firefox中使用SQlite Manager插件,但同样的问题。
I have a external database and I use sqlite 3 version 3.13.0 with 2 table like this.
And I create a virtual table:
CREATE VIRTUAL TABLE tb_bank_fts USING fts4 (content="tb_bank",address, typename)
Virtual table create successfull and I can use select.
But I can't use "match" query with fts4 table, alway return null with no error.
Half month ago I can query fts4 table with "match" but now i can't do that.I don't know why. I try using SQlite Manager addon in Firefox but same problem.
原文:https://stackoverflow.com/questions/38298562
更新时间:2019-12-17 05:10
最满意答案
文件说:
FTS4模块从不写入内容表,写入内容表不会影响全文索引。 用户有责任确保内容表和全文索引一致。
因此,当您将数据插入基表时,还必须将其插入FTS表:
INSERT INTO tb_bank_fts(docid, address, typename)
SELECT rowid, address, typename FROM tb_bank;
或者干脆:
INSERT INTO tb_bank_fts(tb_bank_fts) VALUES('rebuild');
The FTS4 module never writes to the content table, and writing to the content table does not affect the full-text index. It is the responsibility of the user to ensure that the content table and the full-text index are consistent.
So when you've inserted data into the base table, you also have to insert it into the FTS table:
INSERT INTO tb_bank_fts(docid, address, typename)
SELECT rowid, address, typename FROM tb_bank;
or simply:
INSERT INTO tb_bank_fts(tb_bank_fts) VALUES('rebuild');
2016-07-11
相关问答
MATCH仅适用于FTS表本身,因此必须在连接之前执行。 在第二个查询中,数据库首先查找匹配的行(使用外部联接,在连接顺序中没有选择),并且该临时结果不再是FTS表。 使用FTS时,最好将FTS搜索(或其他搜索)移动到子查询中: SELECT *
FROM Table2 LEFT JOIN (SELECT *
FROM Table1
WHERE Table1 MATCH ...)
U
...
文件中的陈述有些误导; 虚拟表本身不会将数据存储在数据库中,但实现虚拟表的引擎可能会选择使用其他表来存储数据。 FTS的内容在文档的第9.1节中解释: 对于数据库中的每个FTS虚拟表,将创建三到五个真实(非虚拟)表来存储基础数据。 这些真实的表称为“影子表”。 真实表名为“%_content”,“%_ segdir”,“%_segments”,“%_ stat”和“%_docsize”,其中“%”由FTS虚拟表的名称替换。 That statement from the documentation
...
文件说: 当FTS表上的用户查询需要docid以外的列值时,FTS会尝试从内容表中行的相应列读取请求的值,其rowid值等于当前的FTS docid。 因此视图必须包含一个名为rowid的唯一列,该列对应于FTS表的docid 。 The documentation says: When a users query on the FTS table requires a column value other than docid, FTS attempts to read the requeste
...
文件说: FTS4模块从不写入内容表,写入内容表不会影响全文索引。 用户有责任确保内容表和全文索引一致。 因此,当您将数据插入基表时,还必须将其插入FTS表: INSERT INTO tb_bank_fts(docid, address, typename)
SELECT rowid, address, typename FROM tb_bank;
或者干脆: INSERT INTO tb_bank_fts(tb_bank_fts) VALUES('rebuild');
The documen
...
该ODBC驱动程序是在没有FTS的情况下编译的。 您必须使用System.Data.SQLite,或使用更改的配置重新编译ODBC驱动程序。 That ODBC driver has been compiled without FTS. You have to use System.Data.SQLite, or to recompile the ODBC driver with a changed configuration.
仅在表具有至少一行时,在普通表上使用MATCH才会生成错误消息。 FTS表有一个与表名同名的虚拟列。 所以你可以尝试像SELECT MyTable FROM MyTable这样的查询。 您可以检查是否存在影子表 ( MyTable_content , MyTable_segdir等)。 您可以检查系统表中的CREATE TABLE语句: SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'MyTable'; Using MA
...
FTS表具有名为docid或rowid的内部INTEGER PRIMARY KEY列。 在FTS表中插入一行时,将该列设置为原始表中该行的主键。 然后,您可以使用单独的查询或使用如下连接轻松查找相应的行: SELECT *
FROM t2
WHERE id IN (SELECT docid
FROM fts_table
WHERE col_text MATCH 'something')
FTS tables have an internal I
...
索引对于根据索引列的值查找表行非常有用。 找到表行后,索引不再有用,因为通过任何其他标准查找索引中的表行效率不高。 这意味着不可能为查询中访问的每个表使用多个索引 。 另请参阅文档: 查询计划 , 查询优化程序 。 您的第一个查询具有以下EXPLAIN QUERY PLAN输出: 0 0 0 SCAN TABLE MessageSearchTable VIRTUAL TABLE INDEX 4: (~0 rows)
0 1 1 SEARCH TABLE MessageTable USING INT
...
文档中的示例使用增强的查询语法 。 检查PRAGMA compile_options; 包括ENABLE_FTS3_PARENTHESIS 。 您的NEAR查询不起作用不是编译选项的问题: > SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';
Error: malformed MATCH expression: [(database OR sqlite) NEAR/5 system]
问题在于,根据
...
你试过重建你的sqlite3 gem吗? 这对我有用。 Have you tried rebuilding your sqlite3 gem? That did the trick for me.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。