- Một thư viện đơn giản để tìm kiếm văn bản không cần chỉ mục trong JavaScript
- Có thể dùng trong nhiều loại dự án và cung cấp sắp xếp kết quả dựa trên TF-IDF cùng hiệu năng tìm kiếm nhanh
- Không có nhiều tính năng như FlexSearch hay lunr.js, nhưng nhanh và hiệu quả hơn rất nhiều so với
text.indexOf(query) > -1
- Hữu ích cho các ứng dụng web đơn giản xử lý tập dữ liệu nhỏ
Tính năng chính
- Tìm kiếm không cần chỉ mục: không cần quá trình lập chỉ mục trước để tìm kiếm
- Hỗ trợ nhiều tùy chọn tìm kiếm:
- Phân biệt chữ hoa chữ thường
- Hỗ trợ tìm theo từ, tìm theo tiền tố và kiểu tự động hoàn thành
- Hiệu năng nhanh: có thể tìm kiếm theo thời gian thực trên vài nghìn mục
- Xếp hạng TF-IDF: sắp xếp kết quả tìm kiếm theo mức độ liên quan cao nhất
API
- Hàm
search nhận hai đối số bắt buộc và hai đối số tùy chọn.
items: danh sách mục cần tìm. Thường là một mảng chuỗi hoặc mảng đối tượng có thuộc tính chuỗi.
query: chuỗi truy vấn cần tìm.
by (tùy chọn): hàm trả về giá trị chuỗi từ một mục. Mặc định là x => String(x).
options (tùy chọn): đối tượng chứa các tùy chọn tìm kiếm.
caseSensitive: có phân biệt chữ hoa chữ thường hay không. Mặc định là false.
mode: cách khớp các từ truy vấn chưa hoàn chỉnh.
mode: 'word': chỉ khớp từ hoàn chỉnh.
mode: 'prefix': khớp theo tiền tố của từ.
mode: 'autocomplete': chế độ lai, trong đó từ truy vấn cuối cùng có thể chưa hoàn chỉnh.
Ví dụ sử dụng
import { search } from 'libsearch'; // môi trường Node.js
const { search } = window.libsearch; // môi trường trình duyệt
// Tìm kiếm cơ bản
search(articles, 'berkeley cali', a => a.title);
// => [{ title: 'Weather in Berkeley, California' }]
// Tìm kiếm theo từ: “California” chỉ tìm “California”
search(articles, 'california', a => a.title, { mode: 'word' });
// Tìm kiếm phân biệt chữ hoa chữ thường: tìm bằng chữ hoa “W”
search(articles, 'W', a => a.title, { caseSensitive: true });
// Xử lý truy vấn rỗng: trả về toàn bộ kết quả
search(articles, '', a => a.title);
Cách tìm kiếm hoạt động
- libsearch thực hiện tìm kiếm toàn văn nhanh trên danh sách đối tượng JavaScript mà không cần chỉ mục tìm kiếm được xây dựng sẵn
-
- Chuyển truy vấn thành biểu thức chính quy
- Sử dụng engine biểu thức chính quy được tối ưu của các JavaScript engine hiện đại để chuyển chuỗi truy vấn thành bộ lọc regex rồi thực hiện tìm kiếm
- Ví dụ: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
-
- Tính xếp hạng TF-IDF dựa trên mức khớp regex và độ dài tài liệu
- Sử dụng độ dài tài liệu (số ký tự) thay cho số từ trong tài liệu để xấp xỉ TF-IDF
3 bình luận
Có một vấn đề ở đây..
Tôi thấy khá thú vị nên đã xem qua, nhưng có vẻ đã 3 năm rồi không được bảo trì... Liệu có phải thư viện này hoàn hảo đến mức không cần bảo trì nữa không...? Khiến tôi phải đặt câu hỏi.
Ý kiến trên Hacker News
115 dòng TypeScript khá nhẹ, nhưng có thể thiếu những tính năng quan trọng
Nhận ra rằng có thể triển khai tính năng tìm kiếm một cách dễ dàng
Califniathay vìCalifornia, nhưng việc hiểu cách triển khai vẫn rất thú vịThường dùng Fuse trong các ứng dụng JavaScript
Dùng các công cụ như FlexSearch hoặc lunr thì việc xây dựng chỉ mục cho hàng nghìn mục rất nhanh
Đặt câu hỏi lợi ích của việc không có chỉ mục là gì