Thiết lập gợi ý tìm kiếm (auto-complete) bằng Redisearch

Thiết lập gợi ý tìm kiếm (auto-complete) bằng Redisearch

Tin ngắn hàng ngày dành cho bạn
  • Bây giờ hiện đại quá cái gì người ta cũng có thể nghĩ ra được. ferretdb.com là một dự án mã nguồn mở, biến cơ sở dữ liệu PostgreSQL thành... MongoDB. Đúng vậy bạn không nghe nhầm đâu. Nếu vẫn muốn dùng Postgres mà thích cú pháp truy vấn của Mongo thì ferretdb là dành cho bạn.

    À ngoài PostgreSQL ra thì còn có thể cắm vào SQLite nữa. Xịn!!! 🙏

    » Xem thêm
  • Chạy lại sau gần nửa năm bặt vô âm tín. Một cảm giác rất yomost 💀

    » Xem thêm
  • Dành cho những bạn nào đang dùng Cursor. PatrickJS/awesome-cursorrules tập hợp một số tệp .cursorrules để tối ưu hoá lời nhắc dành cho Cursor. Hình dung các tệp này như System Prompt dành cho Cursor, điều khiển nó theo ý của mình trong mỗi dự án á.

    Cách dùng đơn giản lắm, sao chép lại tệp .cursorrules phù hợp rồi bỏ vào thư mục gốc của dự án là được 🥳

    » Xem thêm

Vấn đề

Tìm kiếm là một trong những tính năng quan trọng trên bất kì trang web nào. Thông qua chức năng tìm kiếm, người dùng có thể dễ dàng khám phá nội dung trang web của bạn hơn.

Có nhiều cách để cung cấp cho người dùng tính năng tìm kiếm. Chẳng hạn như chúng ta phân danh mục cho họ lựa chọn hoặc đặt các thẻ (tags) để sàng lọc nội dung, hoặc cung cấp một ô tìm kiếm cho họ thoải mái nhập nội dung tuỳ ý.

Ngày nay trải nghiệm người dùng ngày càng được đặt lên hàng đầu, nhiệm vụ của người quản trị là phải làm sao cho người dùng ít phải động tay động chân nhất. Nhất là không phải để họ phải phân vân khi sử dụng một tính năng nào đó trên trang web, vì điều đó sẽ tăng tỉ lệ khách hàng rời đi. Nếu bạn đã cung cấp tính năng tìm kiếm thì liệu có thể làm gì để người dùng cảm thấy tìm kiếm hữu ích hơn?

Lấy một ví dụ trang web của bạn bán rất nhiều phụ kiện thời trang và một trong số đó đang là sản phẩm trending có tên như "đồng hồ thời trang", "đồng hồ siêu nhân"... Vậy thì làm sao khi người dùng chỉ cần nhập "đồng" thì lập tức những từ khoá bạn thiết lập từ trước sẽ hiện ra gợi ý cho người dùng?

Auto-completion

Auto-completion

Auto-completion là một tính năng mà Redisearch cung cấp để gợi ý tìm kiếm. Cách hoạt động của Auto-completion rất đơn giản đó là bạn tạo ra một chỉ mục dành riêng cho việc gợi ý ra những cụm từ phù hợp với từ khóa cần tìm kiếm.

RediSearch cũng cho phép gợi ý mờ, nghĩa là bạn có thể nhận được kết quả cho từ khoá ngay cả khi người dùng mắc lỗi chính tả. Điều này đạt được bằng cách sử dụng Levenshtein Automaton, cho phép tìm kiếm hiệu quả trong Khoảng cách Levenshtein. Sau đó, các đề xuất được tính trọng số dựa trên cả điểm số (score) và khoảng cách Levenshtein của chúng so với từ khoá do người dùng nhập.

Tuy nhiên, việc tìm kiếm mờ (đặc biệt là các tiền tố rất ngắn) sẽ cho ra một số lượng lớn các gợi ý. Trên thực tế, tìm kiếm mờ cho bất kỳ chữ cái đơn lẻ nào sẽ duyệt qua toàn bộ từ điển, vì vậy bạn nên sử dụng tính năng này một cách cẩn thận, vì sử dụng chúng phải đánh đổi tốc độ tìm kiếm cũng như tài nguyên máy chủ.

Cách thiết lập

Chúng ta chỉ cần tạo ra các chỉ mục dùng cho tính năng gợi ý, xác định điểm (score) để ưu tiên mức độ hiển thị kết quả cho kết quả tìm kiếm.

Ví dụ trong blog của tôi có các bài viết liên quan đến chủ đề Node.js, một trong số đó là các bài "node.js là gì, node.js event loop, node.js tự học..." nên tôi muốn khi người dùng nhập vào tìm kiếm "node.js" thì nó sẽ gợi ý ra những cụm từ trên.

127.0.0.1:6379> FT.SUGADD article "node.js là gì" 100
(integer) 1

127.0.0.1:6379> FT.SUGADD article "node.js event loop" 200
(integer) 2

127.0.0.1:6379> FT.SUGADD article "node.js tự học" 300
(integer) 3

Sau đó thử tìm kiếm gợi ý:

127.0.0.1:6379> FT.SUGGET article "node.js" MAX 5 WITHSCORES
node.js tự học
106.06601715087891
node.js event loop
57.735027313232422
node.js là gì
37.79644775390625

MAX 5 là lấy 5 kết quả đầu tiên, WITHSCORES là hiển thị điểm, điểm càng cao thì càng được ưu tiên. Sở dĩ thứ tự kết quả như trên là lúc thêm suggest tôi đã xác định điểm của "node.js tự học" là cao nhất (300) rồi giảm dần cho các cụm từ sau.

Suggest hỗ trợ tìm kiếm khi người dùng nhập sai ký tự. Ví dụ "nodejs", "nopejs", "nope.js"... nhờ vào thuật toán tính toán khoảng cách Levenshtein. Tuy nhiên đi cùng với đó là vấn đề hiệu suất sẽ giảm đi đôi chút. Để áp dụng chỉ cần thêm từ khóa FUZZY vào trong câu truy vấn.

127.0.0.1:6379> FT.SUGGET article "nope.js" FUZZY MAX 5 WITHSCORES
node.js tự học
106.06601715087891
node.js event loop
57.735027313232422
node.js là gì
37.79644775390625

Auto-completion hiện tại chỉ hỗ trợ từ khóa prefix, tức là chỉ gợi ý được nếu từ khóa đầu vào là những từ ở đầu các cụm từ. Như ví dụ trên, redis chỉ gợi ý được khi tìm kiếm "no", "node", "node.js"... chứ không thể tìm kiếm các từ "event", "là"... Hy vọng các bản cập nhật tiếp theo Auto-completion sẽ hỗ trợ tìm kiếm ở bất kì vị trí nào trong cụm từ.

Để nghiên cứu nhiều hơn bạn có thể xem thêm ở Redis Auto-completion.

Tổng kết

Gợi ý tìm kiếm là tính năng hữu ích mà rất nhiều trang web đang sử dụng. Thông qua cách đó giúp nâng cao trải nghiệm người dùng dựa trên những từ khoá mà người dùng quan tâm để gợi ý đến một cụm từ cụ thể hơn. Những cụm từ đó có thể là "hot trend" hay nội dung chủ lực của website của bạn mong muốn được người dùng quan tâm, khám phá.

Auto-completion của Rediseach còn mang lại nhiều lợi ích hơn dựa vào tính sáng tạo của bạn. Chẳng hạn tự động hoá chỉ mục tìm kiếm liên tục cập nhật các cụm từ gợi ý dựa theo dữ liệu tìm kiếm thu thập được của người dùng để tạo thành "hot trend" tìm kiếm.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Thành Đỗ2 năm trước
Nghĩa là mình vẫn phải tạo một index rồi thêm data tìm kiếm vào chứ nó không dựa theo data sẵn có được à bạn
Trả lời
Avatar
Xuân Hoài Tống2 năm trước
Đúng rồi bạn ơi, tính năng này chỉ hỗ trợ tạo data trong index để hỗ trợ suggest thôi