SQLite FTS示例不起作用

时间:2013-02-02 12:13:33

标签: sqlite fts3 fts4

我已经下载了最新的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';

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

3 个答案:

答案 0 :(得分: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*';

答案 1 :(得分:3)

文档中的示例使用enhanced query syntax。 检查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

答案 2 :(得分:0)

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

查看零件 2。编译并启用FTS3和FTS4