使用预准备语句的多个标记的SQLite全文搜索

时间:2012-07-03 19:42:11

标签: sqlite full-text-search prepared-statement

鉴于以下表格:

create table index(name text, docid int);
create virtual table docs using fts4();

以下查询在查询单个令牌时按预期工作(例如:marchbad):

select name from index where docid in (select docid from docs where docs match ?)

但是如何查询多个令牌(比如bad bed)?直接绑定字符串bad bed不起作用(始终不选择任何内容),既不围绕占位符或带双引号的字符串,也不使用AND MATCH每个标记separetly(最后一个抛出)错误)。

3 个答案:

答案 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中的匹配语法中有运算符,因此您可以使用ANDORNOT

See here for documentation

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';