2010-10-12 26 views
6

Tôi có bảng như:Làm thế nào để loại trừ cột từ FTS3 bảng tìm kiếm

CREATE VIRTUAL TABLE t USING FTS3(hidden, text1, text2) 

Tôi muốn sử dụng để có thể searh trên 'text1' và cột 'Text2', vì vậy truy vấn là

SELECT docid FROM t WHERE t MATCH ? 

Và có thể yêu cầu là:

SELECT docid FROM t WHERE t MATCH 'foo' 
SELECT docid FROM t WHERE t MATCH 'text1:foo OR text2:bar' 

Q: làm thế nào tôi có thể loại trừ 'ẩn' cột từ tìm kiếm, vì vậy người dùng không thể tìm thấy hàng theo giá trị ẩn?

Tôi sẽ sử dụng cột 'ẩn' để tham chiếu đến các hàng trong bảng phụ với thông tin bổ sung.

Trả lời

6

Bảng FTS3 có cột số nguyên 64 bit miễn phí được gọi là docid không được lập chỉ mục. Chỉ cần đặt dữ liệu bổ sung trong một bảng riêng biệt trong đó Khóa chính cho bảng đó giống với tài liệu cho bảng FTS3.

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

Cũ chủ đề, nhưng nếu bạn đang sử dụng một xây dựng mới hơn của SQLite (> 3.8), bạn có thể bây giờ sử dụng tùy chọn notindexed, ví dụ:

CREATE VIRTUAL TABLE t USING FTS4(uuid, document, notindexed=uuid); 

này sẽ loại trừ các cột từ trận đấu truy vấn.

Tôi cũng đã làm việc này trên iOS bằng cách nhúng bản dựng SQLite của riêng tôi 3.8.

Documentation for notindexed option

Các vấn đề liên quan