我已经下载了最新的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';
在我的应用中也不需要这种类型的查询。有没有其他方法可以写它以便它可以工作?
答案 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 。