鉴于以下表格:
create table index(name text, docid int);
create virtual table docs using fts4();
以下查询在查询单个令牌时按预期工作(例如:march
或bad
):
select name from index where docid in (select docid from docs where docs match ?)
但是如何查询多个令牌(比如bad bed
)?直接绑定字符串bad bed
不起作用(始终不选择任何内容),既不围绕占位符或带双引号的字符串,也不使用AND
MATCH
每个标记separetly(最后一个抛出)错误)。
答案 0 :(得分:0)
使用intersect
确实有效,但在搜索多个令牌时它很笨拙且无效:
select name from index where docid in (
select docid from docs where docs match ?
intersect
select docid from docs where docs match ?
intersect
...
)
每个?
都与一个令牌配对。
答案 1 :(得分:0)
您可以在sqlite中使用连接运算符||
。 ''
将是空字符串
SELECT * FROM table WHERE docs MATCH '' || ? || ' ' || ? || ' ' || ? || ''
确保每个令牌或' AND '
之间都有空格。
<强>更新强>
实际上它不起作用。这种方法似乎存在令牌问题。最好将所有标记与空间连接起来,并将结果字符串与单个'?'
绑定在一起答案 2 :(得分:0)
FTS中的匹配语法中有运算符,因此您可以使用AND
,OR
和NOT
。
e.g。
-- Return the docid values associated with all documents that contain the -- two terms "sqlite" and "database", and/or contain the term "library". SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database OR library';