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
  • openai/codex là một dự án mã nguồn mở mới nhất của OpenAI, ngay sau khi họ công bố hai mô hình mới nhất là o3 và o4 mini. Nghe nói cả o3 và o4 mini này rất thích hợp làm Agent nên tung ra codex như một dạng Agent nhỏ nhẹ chạy ngay trong Terminal luôn.

    Về tính ứng dụng, vì nó là Agent nên nó có thể đọc/thêm/sửa/xoá nội dung tệp của bạn luôn. Ví dụ.

    codex "explain this codebase to me"

    Hoặc tích hợp vào pipe line của CI/CD.

    - name: Update changelog via Codex run: | npm install -g @openai/codex export OPENAI_API_KEY="${{ secrets.OPENAI_KEY }}" codex -a auto-edit --quiet "update CHANGELOG for next release"

     À quên mất, phải dùng API của OpenAI nha 😆

    » Xem thêm
  • Có thể nhiều người chưa biết, OpenAI đã mở trang học viện riêng để giúp người dùng học tập và khai thác được tối đa sức mạnh các mô hình ngôn ngữ của họ.

    OpenAI Academy

    » Xem thêm
  • Mới sáng ra đã có tin giật gân: OpenAI muốn mua lại Windsurf với giá 3 tỉ đô 😳

    » 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

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào 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