SQLite 3 では
フルテキスト インデックスを持つフィールドを更新すると、フルテキスト インデックスは更新されますか? それとも手動で更新する必要がありますか?
SQLite 3 では
フルテキスト インデックスを持つフィールドを更新すると、フルテキスト インデックスは更新されますか? それとも手動で更新する必要がありますか?
たとえば、場合によって異なります。「外部コンテンツ FTS4 テーブル」を使用している場合、自動的に更新されません。
http://www.sqlite.org/fts3.html#section_6_2_2から
CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c, d);
CREATE VIRTUAL TABLE t3 USING fts4(content="t2", b, c);
INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2;
-- The following query returns a single row with two columns containing
-- the text values "i j" and "k l".
--
-- The query uses the full-text index to discover that the MATCH
-- term matches the row with docid=3. It then retrieves the values
-- of columns b and c from the row with rowid=3 in the content table
-- to return.
--
SELECT * FROM t3 WHERE t3 MATCH 'k';
-- Following the UPDATE, the query still returns a single row, this
-- time containing the text values "xxx" and "yyy". This is because the
-- full-text index still indicates that the row with docid=3 matches
-- the FTS4 query 'k', even though the documents stored in the content
-- table have been modified.
--
UPDATE t2 SET b = 'xxx', c = 'yyy' WHERE rowid = 3;
SELECT * FROM t3 WHERE t3 MATCH 'k';
ただし、トリガーを介して解決することもできます。
フルテキスト インデックスとコンテンツ テーブルに個別に書き込む代わりに、データベース トリガーを使用して、コンテンツ テーブルに格納されている一連のドキュメントに関してフルテキスト インデックスを最新の状態に保つことを希望するユーザーもいます。たとえば、前の例のテーブルを使用すると、次のようになります。