当前位置:   article > 正文

android sqlite fts4,FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)

sqllite match

FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)

我有一个外部数据库,我使用sqlite 3版本3.13.0与2表这样。

fc72563af8ebd9240ad521c94c2f17ce.png

我创建了一个虚拟表:

CREATE VIRTUAL TABLE tb_bank_fts USING fts4 (content="tb_bank",address, typename)

虚拟表创建成功,我可以使用选择。

aaf72d8d29692dd51e31dd8624e83774.png

但是我不能使用fts4表的“匹配”查询,总是返回null而没有错误。

cff415a512cf895e44f21f56b4e6133f.png

半个月前,我可以用“匹配”查询fts4表,但现在我不能这样做。我不知道为什么。 我尝试在Firefox中使用SQlite Manager插件,但同样的问题。

I have a external database and I use sqlite 3 version 3.13.0 with 2 table like this.

fc72563af8ebd9240ad521c94c2f17ce.png

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.

aaf72d8d29692dd51e31dd8624e83774.png

But I can't use "match" query with fts4 table, alway return null with no error.

cff415a512cf895e44f21f56b4e6133f.png

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.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/492328
推荐阅读
相关标签
  

闽ICP备14008679号