1

次の表があるとします。

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したりしません(この最後の1つはエラーをスローします)。MATCH

4

3 に答える 3

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 つのトークンとペアになっています。

于 2012-07-03T20:54:14.377 に答える
0

FTS の match 構文内には演算子があるためAND、 、ORおよびを使用できますNOT

ドキュメントについては、こちらを参照してください

例えば

-- を含むすべてのドキュメントに関連付けられた docid 値を返します。
-- 「sqlite」と「データベース」という 2 つの用語、および/または「ライブラリ」という用語が含まれています。
SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database OR library';
于 2015-03-10T18:54:45.213 に答える