Tóm tắt :trong hướng dẫn này, bạn sẽ học cách sử dụng tính năng tìm kiếm toàn văn bản của SQLite bằng cách sử dụng mô-đun bảng ảo FTS5.
Giới thiệu về tìm kiếm toàn văn SQLite
Bảng ảo là một phần mở rộng tùy chỉnh cho SQLite. Một bảng ảo giống như một bảng bình thường. Sự khác biệt giữa bảng ảo và bảng bình thường là dữ liệu đến từ đâu, tức là khi bạn xử lý một bảng bình thường, SQLite truy cập tệp cơ sở dữ liệu để truy xuất dữ liệu. Tuy nhiên, khi bạn truy cập một bảng ảo, SQLite sẽ gọi mã tùy chỉnh để lấy dữ liệu. Mã tùy chỉnh có thể có logic được chỉ định để xử lý các tác vụ nhất định như lấy dữ liệu từ nhiều nguồn dữ liệu.
Để sử dụng tìm kiếm toàn văn trong SQLite, bạn sử dụng mô-đun bảng ảo FTS5.
CREATE VIRTUAL TABLE
câu lệnh tạo một bảng FTS5 với hai cột:
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
Lưu ý rằng bạn không thể thêm các loại, ràng buộc hoặc PRIMARY KEY
khai báo trong CREATE VIRTUAL TABLE
câu lệnh để tạo bảng FTS5. Nếu bạn làm như vậy, SQLite sẽ gặp lỗi.
Giống như tạo một bảng bình thường mà không chỉ định cột khóa chính, SQLite thêm một rowid
ngầm hiểu vào bảng FTS5.
Ví dụ sau tạo một bảng FTS5 có tên posts
với hai cột title
và body
.
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
Tương tự như một bảng thông thường, bạn có thể chèn dữ liệu vào posts
bảng như sau:
INSERT INTO posts(title,body)
VALUES('Learn SQlite FTS5','This tutorial teaches you how to perform full-text search in SQLite using FTS5'),
('Advanced SQlite Full-text Search','Show you some advanced techniques in SQLite full-text searching'),
('SQLite Tutorial','Help you learn SQLite quickly and effectively');
Code language: SQL (Structured Query Language) (sql)
Và truy vấn dữ liệu chống lại nó:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
Truy vấn dữ liệu bằng cách sử dụng tìm kiếm toàn văn
Bạn có thể thực hiện truy vấn toàn văn bản dựa trên bảng FTS5 bằng một trong ba cách sau.
Đầu tiên, sử dụng MATCH
trong mệnh đề WHERE của câu lệnh SELECT. Ví dụ:để lấy tất cả các hàng có từ fts5
, bạn sử dụng truy vấn sau:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
Thứ hai, sử dụng dấu bằng (=
) trong toán tử WHERE
mệnh đề của SELECT
tuyên bố. Câu lệnh sau trả về kết quả tương tự như câu lệnh ở trên:
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql)
Thứ ba, sử dụng cú pháp hàm giá trị theo bảng. Theo cách này, bạn sử dụng cụm từ tìm kiếm làm đối số bảng đầu tiên:
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
Theo mặc định, FTS5 không phân biệt chữ hoa chữ thường. Nó xử lý các điều khoản fts5
FTS5
và Fts5
giống nhau.
Để sắp xếp các kết quả tìm kiếm từ phù hợp nhất đến ít liên quan nhất, bạn sử dụng mệnh đề ORDER BY như sau:
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Sử dụng cú pháp truy vấn toàn văn bản
Truy vấn tìm kiếm toàn văn được tạo thành từ các cụm từ, trong đó mỗi cụm từ là một danh sách có thứ tự của một hoặc nhiều mã thông báo. Bạn có thể sử dụng toán tử “+” để nối hai cụm từ như ví dụ sau:
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql)
FTS5 xác định liệu tài liệu có khớp với một cụm từ hay không nếu tài liệu chứa ít nhất một dãy con của mã thông báo khớp với chuỗi mã thông báo được sử dụng để tạo cụm từ.
Truy vấn sau trả về tất cả các tài liệu khớp với cụm từ tìm kiếm Learn SQLite
:
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
Tìm kiếm tiền tố
Bạn có thể sử dụng dấu hoa thị (*) làm mã thông báo tiền tố. Khi một cụm từ chứa dấu hoa thị (*), nó sẽ khớp với bất kỳ tài liệu nào có chứa mã thông báo bắt đầu bằng cụm từ đó. Ví dụ:tìm kiếm * đối sánh với tìm kiếm, tìm kiếm, tìm kiếm, v.v. Xem ví dụ sau:
SELECT *
FROM posts
WHERE posts = 'search*';
Code language: SQL (Structured Query Language) (sql)
Toán tử boolean
Bạn có thể sử dụng toán tử Boolean, ví dụ:NOT
, OR
hoặc AND
để kết hợp các truy vấn.
- q1 VÀ q2:đối sánh nếu cả hai truy vấn q1 và q2 đều khớp.
- q1 HOẶC q2:đối sánh nếu truy vấn q1 hoặc q2 khớp.
- q1 KHÔNG phải q2:khớp nếu truy vấn q1 khớp và q2 không khớp.
Ví dụ:để lấy các tài liệu phù hợp với learn
nhưng không khớp với FTS5
, bạn sử dụng NOT
toán tử như sau:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
Để tìm kiếm tài liệu khớp với một trong hai cụm từ learn
hoặc text
, bạn sử dụng OR
toán tử như ví dụ sau:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
Để tìm các tài liệu phù hợp với cả SQLite và tìm kiếm, bạn sử dụng AND
toán tử như hình dưới đây:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
Để thay đổi mức độ ưu tiên của toán tử, bạn sử dụng dấu ngoặc đơn để nhóm các biểu thức. Ví dụ:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
Câu lệnh trả về các tài liệu khớp với search
và sqlite
hoặc help
. Để tìm các tài liệu phù hợp với search
và sqlite
hoặc help
, bạn sử dụng dấu ngoặc đơn như sau:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
Các chức năng phụ trợ tích hợp
SQLite cung cấp ba hàm bổ trợ tích hợp có thể được sử dụng trong các truy vấn toàn văn trên bảng FTS5.
-
bm25()
trả về giá trị đại diện cho độ chính xác của kết quả khớp hiện tại, giá trị thấp hơn có nghĩa là giá trị khớp tốt hơn. -
highlight()
chức năng phụ trợ trả về một bản sao của văn bản với các cụm từ tìm kiếm được bao quanh bởi một đánh dấu cụ thể, ví dụ: cụm từ tìm kiếm -
snippet()
chọn một đoạn văn bản ngắn để tối đa hóa số lượng cụm từ tìm kiếm trong đoạn văn bản đó.
Ví dụ:truy vấn sau sử dụng hàm highlight () để trang trí các cụm từ tìm kiếm bằng cách sử dụng thẻ tag :
SELECT highlight(posts,0, '<b>', '</b>') title,
highlight(posts,1, '<b>', '</b>') body
FROM posts
WHERE posts MATCH 'SQLite'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
Trong hướng dẫn này, bạn đã học cách sử dụng các tính năng tìm kiếm toàn văn bản của SQLite thông qua mô-đun bảng ảo FTS5.