5

我已经下载了最新的 SQLite 3.7.15.2 shell (Win32) 并尝试完全按照http://sqlite.org/fts3.html#section_3中的内容执行 FTS 示例之一

-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3();

-- Virtual table data
INSERT INTO docs(docid, content) VALUES(1, 'a database is a software system');
INSERT INTO docs(docid, content) VALUES(2, 'sqlite is a software system');
INSERT INTO docs(docid, content) VALUES(3, 'sqlite is a database');

-- Return the set of documents that contain the term "sqlite", and the
-- term "database". This query will return the document with docid 3 only.
SELECT * FROM docs WHERE docs MATCH 'sqlite AND database';

但尽管最后一条评论 SELECT 导致空集。它是 SQLite 中的错误还是只是过时的文档?(以及正确的语法是什么?)。

对我来说最重要的是那个查询

SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';

也不起作用,我在我的应用程序中需要那种类型的查询。有没有其他方法可以编写它以便它工作?

4

3 回答 3

3

文档中的示例使用增强的查询语法。检查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]

问题在于,根据文档,NEAR它仅适用于基本搜索表达式:

NEAR 查询是通过在两个短语、术语或前缀查询之间放置关键字“NEAR”来指定的。

所以你必须相应地重写你的搜索表达式:

> SELECT * FROM docs WHERE docs MATCH '(database NEAR/5 system) OR (sqlite NEAR/5 system)';
a database is a software system
sqlite is a software system
于 2013-02-02T21:05:40.210 回答
3

我不知道它是文档还是 SQLite 的错误,但这里有一些替代方案:

对于AND查询

不起作用:

select * from docs where docs match 'sqlite AND database';

作品(使用隐含AND):

select * from docs where docs match 'sqlite database';

OR似乎工作:

select * from docs where docs match 'sqlite OR database';

对于OR+NEAR查询:

不工作:

SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';

作品:

SELECT * FROM docs WHERE docs MATCH 'database NEAR/5 system'
UNION
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR/5 system'

编辑:对于评论中提到的表格 (word11 OR word12 OR word13) NEAR/2 (word21 OR word22 OR word23) NEAR/2 (word31 OR word32 OR word33。这是我能做的最好的是将所有组合与一个 UNION 放在一起:

SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word21 NEAR/2 word31'
UNION
SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word22 NEAR/2 word32'
UNION
SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word23 NEAR/2 word33'
UNION
SELECT * FROM docs WHERE docs MATCH 'word12 NEAR/2 word21 NEAR/2 word31'
...

以上当然会创建大量的 SQL。如果您的单词相似,只是结尾不同,则可以使用通配符:

SELECT * FROM docs WHERE docs MATCH 'word1* NEAR/2 word2* NEAR/2 word3*';
于 2013-02-02T14:36:30.910 回答
0

根据文档(https://www.sqlite.org/fts3.html),默认情况下不支持括号。

查看第2 部分。编译和启用 FTS3 和 FTS4

于 2020-10-20T22:53:39.470 回答