12 điểm bởi GN⁺ 2024-12-30 | 3 bình luận | Chia sẻ qua WhatsApp
  • 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
    1. 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
    1. 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

 
yangeok 2025-01-06

Có một vấn đề ở đây..

 
beenzinozino 2025-01-04

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.

 
GN⁺ 2024-12-30
Ý 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

    • Có cung cấp liên kết để so sánh kích thước, bộ tính năng và hiệu năng của nhiều lựa chọn thay thế cho JavaScript
    • Chia sẻ kinh nghiệm đã chọn uFuzzy vài năm trước
  • 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

    • Đây là một bộ máy regex rất thông minh
    • Chưa rõ nó xử lý tìm kiếm mơ hồ như thế nào, ví dụ Califnia thay 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

    • Rất khó chịu khi nhiều tính năng tìm kiếm trong ứng dụng không xử lý được lỗi gõ sai
  • 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

    • Có thể xây dựng chỉ mục khi người dùng mở giao diện tìm kiếm, rồi quên nó đi sau khi dùng xong cũng không sao
  • Đặt câu hỏi lợi ích của việc không có chỉ mục là gì

    • Thích những chương trình nhỏ và đơn giản
    • Trông giống như grep