質問
私はそのようなテーブルを持っています:
CREATE VIRTUAL TABLE t USING FTS3(hidden, text1, text2)
ユーザーに「text1」と「text2」列を介してsearhすることができるようにしたいので、クエリは
SELECT docid FROM t WHERE t MATCH ?
可能なリクエストは次のとおりです。
SELECT docid FROM t WHERE t MATCH 'foo'
SELECT docid FROM t WHERE t MATCH 'text1:foo OR text2:bar'
Q:ユーザーが非表示の値で行を見つけることができないように、検索から「非表示の」列を除外するにはどうすればよいですか?
「非表示」列を使用して、追加情報を使用してセカンダリテーブルの行を参照します。
解決
FTS3テーブルは、インデックス化されていないDocidと呼ばれる無料の64ビット整数列を取得します。そのテーブルの主キーがFTS3テーブルのDocidと同じである別のテーブルに追加のデータを配置するだけです。
CREATE VIRTUAL TABLE t USING FTS3(text1, text2);
CREATE TABLE additional (id INTEGER PRIMARY KEY, hidden VARCHAR);
INSERT INTO t (docid, text1, text2) VALUES (243, 'foo', 'bar');
INSERT INTO additional VALUES (243, 'bas');
SELECT docid, text1, text2, hidden FROM t JOIN additional ON t.docid = additional.id WHERE t MATCH 'foo';
他のヒント
古いスレッドですが、SQLiteの新しいビルド(> 3.8)を使用している場合、これで使用できます notindexed
オプション、例:
CREATE VIRTUAL TABLE t USING FTS4(uuid, document, notindexed=uuid);
これにより、マッチクエリから列が除外されます。
また、SQLite 3.8の独自のビルドを埋め込むことにより、これをiOSで動作させました。
所属していません StackOverflow