質問

私はそのようなテーブルを持っています:

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で動作させました。

notindexedオプションのドキュメント

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top